二叉树递归算法:
1. 统计二叉树中,度为0的结点个数
2. 统计二叉树中,度为1的结点个数
3. 统计二叉树中,度为2的结点个数
4. 统计二叉树高度
5. 统计二叉树宽度度
6. 删除二叉树中所有叶子节点
7. 交换每个节点的左右子女
8. 判断一棵树是否为二叉排序树
9. 找出给定结点在二叉树中的层次
10. 判断二叉树是否为平衡二叉树
首先,创建二叉树
BiTree CreateBiTree( ){
char ch;
scanf("%c",&ch);
if(ch=='#') return NULL;
else{
BiTree T = (BiTree)malloc(sizeof(BiTNode));
T -> lchild = T -> rchild = NULL;
T->data = ch;
T->lchild = CreateBiTree();
T->rchild = CreateBiTree();
return T;
}
}
1.统计二叉树中,度为0的结点个数
int Degree_0(BiTree T){
if(T==NULL) return 0 ;
if( T->lchild==NULL && T->rchild == NULL )
return 1 + Degree_0(T->lchild )+ Degree_0(T->rchild) ;
else
return Degree_0(T->lchild )+ Degree_0(T->rchild) ;
}
2.统计二叉树中,度为1的结点个数
int Degree_1(BiTree T){
if(T==NULL) return 0 ;
if(( T->lchild!=NULL && T->rchild == NULL ) ||( T->lchild==NULL && T->rchild != NULL ) )
return 1 + Degree_1(T->lchild )+ Degree_1(T->rchild) ;
else
return Degree_1(T->lchild )+ Degree_1(T->rchild) ;
}
3.统计二叉树中,度为2的结点个数
int Degree_2(BiTree T){
if(T==NULL) return 0 ;
if( T->lchild!=NULL && T->rchild != NULL )
return 1 + Degree_2(T->lchild )+ Degree_2(T->rchild) ;
else
return Degree_2(T->lchild )+ Degree_2(T->rchild) ;
}
4.统计二叉树高度
int Depth( BiTree T ){
if(T == NULL) return 0;
else return max(Depth(T->lchild),Depth(T->rchild))+1;
}
5.统计二叉树宽度
void Width( BiTree T ,int deep){
if(T == NULL) return ;
else{
s[deep]++ ;
Width( T->lchild , deep +1 );
Width( T->rchild , deep +1 );
}
}
6.删除二叉树中所有叶子节点
void Delete_leaves(BiTree T){
if( T ){
if(T->lchild){
if(T->lchild->lchild==NULL&&T->lchild->rchild==NULL){
free(T->lchild);
T->lchild=NULL ;
}
else
Delete_leaves(T->lchild);
}
if(T->rchild){
if(T->rchild->lchild==NULL&&T->rchild->rchild==NULL){
free(T->rchild);
T->rchild=NULL ;
}
else
Delete_leaves(T->rchild);
}
}
}
7.交换每个节点的左右子女
void swap(BiTree T){
BiTNode *p ;
if(T){
swap(T->lchild);
swap(T->rchild);
p = T->lchild ;
T->lchild = T->rchild ;
T->rchild = p ;
}
}
8.判断一棵树是否为二叉排序树
二叉排序树的中序遍历是递增有序序列。因此,对于给定的二叉树进行中序递归遍历,如果能保持前一个值始终比后一个值小,而说明二叉树是一颗二叉排序树。
1)设置全局变量max为无穷小。
2)若树为空,则返回true。
3)否则递归判断左子树是否为二叉排序树,并用bst_l保存结果。
3)若flag1为假或者根节点关键字小于等于左子树的关键字,则返回false。
4)否则递归判断右子树是否为二叉排序树,并用bst_r保存结果。
5)返回 bst_r。
//判断是否为二叉排序树
bool Judge(BinaryTree* root,int& MAX){
if(root == NULL) //树为空则为二叉排序树
return true;
bool bst_l,bst_r;
bst_l = Judge(root->lchild,MAX);//判断左子树是否为二叉排序树
if(!bst_l || MAX >= root->data)
return false;
MAX = root->data; //保存当前结点关键字
bst_r = Judge(root->rchild,MAX);//判断右子树是否为二叉排序树
return bst_r;
}
9. 找出给定结点在二叉树中的层次
假设二叉树采用二叉链表存储。每查找一次就下降一层,因此查找该节点所用的次数就是该节点在二叉排序树中的层次。采用二叉树非递归查找,用n保存查找层次,,每查找一次,n++,直到找到相应节点。
int level(Bitree bt,BSTNode *p){
//计算给定结点在二叉树的层次
int n=0; // 统计查找次数
Bitree t=bt;
if(bt!=NULL){
n++;
while(t->data!=p->data){
if(t->data<p->data)
t=t->rchild;
else
t=t->lchild;
n++;
}
}
return n;
}
10. 判断二叉树是否为平衡二叉树
根据二叉树的定义,我们可以递归遍历二叉树的每一个节点来,求出每个节点的左右子树的高度,如果每个节点的左右子树的高度相差不超过1,按照定义,它就是一颗平衡二叉树。
bool isBalanced(BiTree root){
if(!root)
return true; // 空树是平衡二叉树
int Ldepth= Depth(root->Left);
int Rdepth= Depth(root->Right);
int diff=Ldepth-Rdepth;
if(abs(diff)>1)
return false;
return isBalanced(root->Left) && isBalanced(root->Right);
}