二叉树的递归算法

(一)问题描述

1.求二叉树的层次(高度)

2.求二叉树的叶子个数

3.求二叉树的总结点个数

4.求二叉树的度为1的结点个数

5.求二叉树的度为2的结点个数

6.复制二叉树

7.交换二叉树的左右子树

8.利用先序和中序序列建立二叉链表存储的二叉树

9.判定二叉树是否为完全二叉树

10.判定两棵二叉树是否相似

(二)基本要求

1.用二叉链表的形式存储二叉树

2.利用C的图形功能显示二叉树形态

(三)测试数据

自拟

(四)实现提示

充分理解递归原理及实现方法。

 

以下是参考代码:

int level(BiTree T) /*计算二叉树的层次*/

{

 int l1,l2;

 if(T==NULL) return 0;

 else{l1=level(T->lchild);

      l2=level(T->rchild);

      return l1>l2?l1+1:l2+1;

 }

}

int leaf(BiTree T) /*求二叉树叶子结点个数,用递归算法实现*/

{

 int n1,n2;

 if(T==NULL)return 0;

 elseif(T->lchild==NULL&&T->rchild==NULL)

       return 1;

      else{n1=leaf(T->lchild);

           n2=leaf(T->rchild);

           return n1+n2;

          }

}

int nodes(BiTree T) /*求二叉树结点个数,用递归算法实现*/

{

 int n1,n2;

 if(T==NULL)return 0;

 elseif(T->lchild==NULL&&T->rchild==NULL)

       return 1;

      else{n1=nodes(T->lchild);

           n2=nodes(T->rchild);

           return n1+n2+1;

          }

}

int node1(BiTree T) /*求二叉树度为1的结点个数,用递归算法实现*/

{

 int n1,n2,n=0;

 if(T==NULL)return 0;

 else {

     if(T->lchild&&T->rchild==NULL||T->lchild==NULL&&T->rchild)

       n=1;

     n1=node1(T->lchild);

     n2=node1(T->rchild);

      returnn1+n2+n;

      }

}

int node2(BiTree T) /*求二叉树度为2的结点个数,用递归算法实现*/

{

 int n=0,n1,n2;

 if(T==NULL)return 0;

 else {

     if(T->lchild&&T->rchild)

       n=1;

     n1=node2(T->lchild);

     n2=node2(T->rchild);

      returnn+n1+n2;

      }

}

void Copy(BiTree T,BiTree *T2) /*复制二叉树*/

{

 if(T==NULL)*T2=NULL;

 else{*T2=(BiTree)malloc(sizeof(BiTNode));

     (*T2)->data=T->data;

     Copy(T->lchild,&(*T2)->lchild);

     Copy(T->rchild,&(*T2)->rchild);

     }/*else*/

}

void exchange(BiTree *T) /*交换二叉树的左右子树*/

{

 BiTNode *t;

 if(*T)

 {t=(*T)->lchild;

 (*T)->lchild=(*T)->rchild;

 (*T)->rchild=t;

 exchange(&(*T)->lchild);

 exchange(&(*T)->rchild);

 }

}

int IsCompleteBiTree(BiTree  T) /*判断一棵二叉树是否为完全二叉树,利用队列实现*/

{BiTNode *p;

 LinkQueue Q;

 InitQueue(&Q);

 EnQueue(&Q,T);

 while(!QueueEmpty(Q))

 {

 DeQueue(&Q,&p);

 if(p==NULL)     /*出现了空结点*/

    {while(!QueueEmpty(Q))/*判断其后面是否还有非空结点,若有则不是完全二叉树*/

    {DeQueue(&Q,&p);

     if(p!=NULL)

       return  0;

     }

     return   1;

    }/*if*/

 else{EnQueue(&Q,p->lchild);

      EnQueue(&Q,p->rchild);

      }

 }/*while*/

}

    原文作者:递归算法
    原文地址: https://blog.csdn.net/a2796749/article/details/46609449
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞