Chinaunix首页 | 论坛 | 博客
  • 博客访问: 269360
  • 博文数量: 88
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 840
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-20 21:13
文章分类

全部博文(88)

文章存档

2022年(1)

2017年(1)

2016年(2)

2015年(1)

2014年(83)

分类: C#/.net

2014-08-07 19:07:44

递归实现基本思想:

为了求得树的深度,可以先求左右子树的深度,取二者较大者加1即是树的深度,递归返回的条件是若节点为空,返回0

算法:

点击(此处)折叠或打开

  1. int FindTreeDeep(BinTree BT){
  2.      int deep=0;
  3.      if(BT){
  4.          int lchilddeep=FindTreeDeep(BT->lchild);
  5.          int rchilddeep=FindTreeDeep(BT->rchild);
  6.          deep=lchilddeep>=rchilddeep?lchilddeep+1:rchilddeep+1;
  7.      }
  8.      return deep;
  9. }

 

非递归实现基本思想:

受后续遍历二叉树思想的启发,想到可以利用后续遍历的方法来求二叉树的深度,在每一次输出的地方替换成算栈S的大小,遍历结束后最大的栈S长度即是栈的深度。

算法的执行步骤如下:

(1)当树非空时,将指针p指向根节点,p为当前节点指针。

(2)将p压入栈S中,0压入栈tag中,并令p执行其左孩子。

(3)重复步骤(2),直到p为空。

(4)如果tag栈中的栈顶元素为1,跳至步骤(6)。从右子树返回

(5)如果tag栈中的栈顶元素为0,跳至步骤(7)。从左子树返回

(6)比较treedeep与栈的深度,取较大的赋给treedeep,对栈S和栈tag出栈操作,p指向NULL,并跳至步骤(8)。

(7)将p指向栈S栈顶元素的右孩子,弹出栈tag,并把1压入栈tag。(另外一种方法,直接修改栈tag栈顶的值为1也可以)

(8)循环(2)~(7),直到栈为空并且p为空

(9)返回treedeep,结束遍历

点击(此处)折叠或打开

  1. int TreeDeep(BinTree BT ){
  2.     int treedeep=0;
  3.     stack S;
  4.     stack tag;
  5.     BinTree p=BT;
  6.     while(p!=NULL||!isEmpty(S)){
  7.         while(p!=NULL){
  8.             push(S,p);
  9.             push(tag,0);
  10.             p=p->lchild;
  11.         }
  12.         if(Top(tag)==1){
  13.             deeptree=deeptree>S.length?deeptree:S.length;
  14.             pop(S);
  15.             pop(tag);
  16.             p=NULL;
  17.         }else{
  18.             p=Top(S);
  19.             p=p->rchild;
  20.             pop(tag);
  21.             push(tag,1);
  22.         }
  23.     }
  24.     return deeptree;
  25. }

阅读(553) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~