数据结构用非递归算法求二叉树高度

算法思想: 采用层次遍历的算法,设置变量level记录当前节点所在层数,设置变量last指向当前层的最右结点,每层遍历出队时与last指针比较,若两者相等,则层数加一,并让last指向下一层的最右结点即rear所在位置,直到变量完成。level的值即为二叉树的高度。

代码如下:

 1 int Btdepth(BiTree T)
 2 {
 3     if(T==NULL)          //树空高度为0
 4         return 0;
 5     int front=rear=-1;
 6     int last=level=0;     //last指向当前层的最右结点
 7     BiTree Q[MAXSIZE];     //设置队列Q,元素是二叉树结点指针且容量足够
 8     Q[++rear]=T;           //将根节点入队
 9     BiTree p=T;
10     while(!IsEmpty(Q))      //
11     {
12         p=Q[++front];        //队列元素出队,即正在访问的结点
13         if(p->lchild)
14             Q[++rear]=p->lchild;     //左孩子入队
15         if(p->rchild)
16             Q[++rear]=p->rchild;        //右孩子入队
17         if(front==last)       //访问到该层的最后一个结点
18         {
19              level++;       //高度加一
20              last=rear;     //更新last指向下一层最右一个结点
21         }
22         
23     }
24     return level;
25 }

扩展:求某一层的结点个数,每层的结点个数、树的最大宽度,都采用与此题类似的思想。当然,此题可采用递归算法,其实现如下

代码如下:

 1 int Btdepth(BiTree T)
 2 {
 3     if(T==NULL)         //空树高度为0
 4         return 0; 
 5     ldep=Btdepth(T->lchild);            //递归遍历左子树
 6     rdep=Btdepth(T->rchild);          //递归遍历右子树
 7     if(ldep>rdep)       //树的高度为子树的最大高度加根节点
 8         return ldep+1;
 9     else
10         return rdep+1;
11 }

 

上一篇:【shell】通过if [ $? != 0 ]判断上次程序是否执行成功


下一篇:Css之nth-of-type与nth-child的区别