复习备考数据结构与算法(三)——树的递归

情到浓时终转凉″ 提交于 2019-12-09 21:54:26

数据结构与算法复习总结(二)

写在前面

今天计划的是上午复习好树和二叉树然后实现一下基本算法,晚上用来学习vue的,可是计划赶不上变化,我之前学习落了太多,一复习感觉好多问题需要解决,然后我理解的比较慢得慢慢思考我才能想清楚,唉,我这脑子我也没办法!以前因为连山哥哥(我们数据结构老师啦)总是布置太多作业,又多又难,能不激起我这个18岁的花季少女的叛逆心理嘛,我简直抗拒到……嘤嘤嘤~
现在自己学习感觉好多了,看着课本顺眼多了。为了应试,老师说树的递归一定会考,划重点!!行吧,我看!我学!

一、树和二叉树的归纳

在这里插入图片描述

二、二叉树的一些递归算法

  1. 二叉树的先序遍历
  2. 二叉树的中序遍历
  3. 二叉树的后序遍历
  4. 计算二叉树的深度
  5. 统计二叉树的节点个数
  6. 统计二叉树的叶子节点个数
  7. 判断两棵二叉树是否相等
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <iostream>
using namespace std;

typedef char TElemType; 
typedef struct BiTNode{
	TElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

void CreatBiTree(BiTree &T);
int Depth(BiTree T);
int NodeCount(BiTree T);
int Degree(BiTree T);
void InorderTraverse(BiTree T);
void PreorderTraverse(BiTree T);
void PostorderTraverse(BiTree T);

//先序序列建立二叉树 
void CreatBiTree(BiTree *T){
	char ch;
	cin>>ch;  
	if (ch == '#'){
		*T = NULL;
	}
	else{
		if (!( (*T) = (BiTNode*)malloc(sizeof(BiTNode))))
		return;
		(*T)->data = ch;
		CreatBiTree(&(*T)->lchild);
		CreatBiTree(&(*T)->rchild);
	}	
}

//二叉树的递归算法 
//计算二叉树的深度
int Depth(BiTree T){
	int m,n;
	if(T==NULL)
	return 0;
	else{
		m=Depth(T->lchild);
		n=Depth(T->rchild);
		if(m>n)
		return (m+1);
		else
		return (n+1);
	}
} 

//统计二叉树节点个数
int NodeCount(BiTree T){
	if(T == NULL)   //递归出口 
	return 0;    
	else
	return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
} 

//叶子节点个数
int LeafNodeCount(BiTree T){
	if(T == NULL)
	return 0;
	else if(T->lchild == NULL && T->rchild == NULL)
	return 1;
	else
	return LeafNodeCount(T->lchild) + LeafNodeCount(T->rchild);
} 

//中序遍历递归 
void InorderTraverse(BiTree T){
    if(T){
        InorderTraverse(T->lchild);
        cout<<T->data;
        InorderTraverse(T->rchild);
    }
}

//先序遍历递归 
void PreorderTraverse(BiTree T){
    if(T){
    	cout<<T->data;
        PreorderTraverse(T->lchild);        
        PreorderTraverse(T->rchild);
    }
}

//后序遍历递归算法 
void PostorderTraverse(BiTree T){
    if(T){   
        PostorderTraverse(T->lchild);        
        PostorderTraverse(T->rchild);
    	cout<<T->data;
    }
}


int main(){
	BiTree T;
	cout<<"先先序创建一棵二叉树:"; 
	CreatBiTree(&T);
	
	cout<<"先序遍历结果:";
	PreorderTraverse(T);
	cout<<endl;
	
	cout<<"中序遍历结果:";
	InorderTraverse(T);
	cout<<endl;
	
	cout<<"后序遍历结果:";
	PostorderTraverse(T);
	cout<<endl;
	
	cout<<"二叉树节点个数:"<<NodeCount(T)<<endl;
	cout<<"二叉树叶子节点个数:"<<LeafNodeCount(T)<<endl;
	cout<<"二叉树深度:"<<Depth(T)<<endl;

	return 0;
}

先序建立的二叉树如下图(粉粉的是不是hin好看)
在这里插入图片描述
程序运行结果如下
在这里插入图片描述

这是判断两棵二叉树是否相等的代码
关于这个我还是有些问题,我在判断的时候我不知道左右两棵子树调换位置了是不是还是相等的,书上说二叉树的子树有左右之分,其次序不能任一颠倒,但也有说二叉排序树,线索二叉树等不可以交换左右子树,但普通二叉树是可以的,比如哈夫曼树。所以我就判断的是左子树要等于左子树,右子树要等于右子树,到时看题目要求叭~

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <iostream>
using namespace std;

typedef char TElemType; 
typedef struct BiTNode{
	TElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

void CreatBiTree(BiTree &T);
int CompareBiTree(BiTree T1, BiTree T2);
void Print(BiTree T1, BiTree T2);


void CreatBiTree(BiTree *T){
	char ch;
	cin>>ch;  
	if (ch == '#'){
		*T = NULL;
	}
	else{
		if (!( (*T) = (BiTNode*)malloc(sizeof(BiTNode))))
		return;
		(*T)->data = ch;
		CreatBiTree(&(*T)->lchild);
		CreatBiTree(&(*T)->rchild);
	}	
}

//比较两棵二叉树是否相等
int CompareBiTree(BiTree T1, BiTree T2){
	if(T1==NULL && T2==NULL)
	return 1;       //如果两个当前根都是NULL,则相等
	
	if((T1==NULL && T2!=NULL) || (T1!=NULL && T2==NULL))   // 上面判断不成立才执行这一步,则至少有一个不为空 
	return 0;     
	
	if(T1->data == T2->data)
	return (CompareBiTree(T1->lchild, T2->lchild) && CompareBiTree(T1->rchild, T2->rchild));
	
	else
	return 0; 
}

void Print(BiTree T1, BiTree T2){
	
	if(CompareBiTree(T1, T2))
	cout<<"这两棵二叉树相等";
	else
	cout<<"这两棵二叉树不相等";
}
int main(){
	BiTree T1;
	BiTree T2; 
	cout<<"先序创建第一棵二叉树:"; 
	CreatBiTree(&T1);
	cout<<"先序创建第二棵二叉树:"; 
	CreatBiTree(&T2);
	
	Print(T1, T2); 
	return 0;
}

今天先总结这么多叭,我今天还有好多学习计划没完成呢,我又得熬夜了,佳佳加油!疲倦是可以战胜的噢~

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!