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


算法思想: 采用层次遍历的算法,设置变量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 }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM