判断完全二叉树以及求二叉树深度的递归与非递归算法实现

 

/* 判断完全二叉树,依据定义:任何一个节点(除去叶子节点)有且仅有两个“孩子” */
#include<stdlib.h>
#define MAX_TREE_DEGREE 10
typedef struct BTnode{//以二叉链表作为存储结构
          char data;
          struct BTnode* lchild;
          struct BTnode* rchild;
          }BTnode,*BTree;
int   createBTree(BTree* T){//先根建立一棵二叉树
        char ch;
        scanf(“%c”,&ch);
        if(ch == ‘ ‘)
               *T = NULL;
        else{
             if(!(*T = (BTnode*)malloc(sizeof(BTnode))))
                return -1;
             (*T)->data = ch;
             createBTree(&(*T)->lchild);
             createBTree(&(*T)->rchild);
             }
        return 1;
}
/** 判断完全二叉树 */
int judgeComBTree(BTree root){//递归方式实现,被注释掉的部分可有可无
if(!root)   //空树
      return 0;
if(!root->lchild && !root->rchild) //没有孩子
      return 1;
//if((!root->lchild && root->rchild) || (root->lchild && !root->rchild)) // 只有一个孩子
// return 0;
return judgeComBTree(root->lchild) & judgeComBTree(root->rchild); // 有且仅有两个孩子
}

/** 二叉树深度的递归算法 */
int depth(BTree root){
int ldepth,rdepth;
if(!root)
      return 0;
else{
        ldepth = depth(root->lchild);
        rdepth = depth(root->rchild);
        if(ldepth >= rdepth) //取左右子树深度的最大值加一返回
              return ldepth+1;
        else
              return rdepth+1;
}
return 1; //只有根节点
}

/** 二叉树深度的非递归算法(在中根遍历算法的基础上修改的来), 关于中根遍历的详细解释参考
   http://blog.csdn.net/panqiaomu/archive/2007/05/17/1612556.aspx    */
int depth2(BTree root){
int top = 0;
int depth = 0,temp = 0;//temp 保存当前单分支的最大值
BTree p = root;
BTree nodePointer[MAX_TREE_DEGREE];
while(p || top > 0){
   if(p){
    nodePointer[top] = p;
    ++ top;
    ++ depth; //统计单分支的深度
    p = p->lchild;
      }else{
    — top;
    p = nodePointer[top];
    p = p->rchild;
    if(p == NULL){ //单分支结束
            if(depth > temp )
                  temp = depth;
             — depth;
       }
   }//else
}//while
return temp;
}

int main(void){ //简单测试
BTree root;
createBTree(&root);
printf(“%d”,judgeComBTree(root));
//compare….
printf(“\nThe depth of curBTree are:%d,%d \n”,depth(root),depth2(root));
system(“pause”);
return 0;
}

 

 

转载至:http://hi.baidu.com/heroqt/item/deb17b43cbb9880ec1161383

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