如何用非递归算法求二叉树的高度

 我来答
兔老大米奇
高粉答主

2019-12-21 · 醉心答题,欢迎关注
知道小有建树答主
回答量:988
采纳率:100%
帮助的人:14.4万
展开全部

if(T==null)

return0;

intfront=-1,

rear=-1;

//front出队指针

rear入队指针intlast=0,

level=0;

//last每一层的最右指针

(front==last时候一层遍历结束level++)BiTreeQ[Maxsize];

//模拟队列Q[++rear]=T;

BiTreep;

while(front<rear){
   

p=Q[++front];//开始出队

因为front要赶到lash

实现level++

if(p->lchild)
 

Q[++rear] = p->lchild;  

 if(p->rchild)
  

Q[++rear] = p->rchild;   

if(front==last){

level++;

last=rear;//last指向下层节点}

扩展资料

非递归算法思想:

(1)设置一个栈S存放所经过的根结点(指针)信息;初始化S;

(2)第一次访问到根结点并不访问,而是入栈;

(3)中序遍历它的左子树,左子树遍历结束后,第二次遇到根结点,就将根结点(指针)退栈,并且访问根结点;然后中序遍历它的右子树。

(4)当需要退栈时,如果栈为空则结束。

mumumomo731
推荐于2017-09-20 · TA获得超过706个赞
知道小有建树答主
回答量:259
采纳率:0%
帮助的人:277万
展开全部
如果是结点的定义中有深度这个属性,那么用一个队列就可以了。
队首放节点 队尾取出节点
比如:根节点放入队列 (开始只有这个一个节点在队列中)
然后呢 从队尾取出这个根节点 然后打散 把他的左右孩子放入对首(这时候有2个节点 也就是二叉树的第二层)
之后从队伍里取出这2个节点 打散 之后队伍里应该是 二叉树第三层的4个节点
。。。。。
这样就把二叉树层次遍历了
因为有些节点没有孩子节点 也就是叶子
这个队列中的节点 逐渐会越来越少
最后一个取出队列的节点 的深度也就是二叉树的高度

如果结点定义没有深度,我写了一个方法,请楼主参考。
public static int findlevel(BinaryNode root)
{
ArrayList<LinkedList<BinaryNode>> result=new ArrayList<LinkedList<BinaryNode>>();
LinkedList<BinaryNode> list=new LinkedList<BinaryNode>();
list.add(root);
result.add(list);
int level=0;
while(true)
{
list=new LinkedList<BinaryNode>();
for(int i=0;i<result.get(level).size();i++)
{
BinaryNode tmp=result.get(level).get(i);
if(tmp.left!=null)
list.add(tmp.left);
if(tmp.right!=null)
list.add(tmp.right);
}
if(list.size()>0)
result.add(list);
else
break;
level++;
}

return level;
}

其实思路和刚才说的是大同小异的,用一个level来记录二叉树的层次,最底的层次就是他的高度。
每一层都存在单独的list里,这些list再存在一个arraylist里,这样很容易就能知道每一层有哪些结点,如果这些结点有孩子,就把level++,直到某一层没有任何结点有孩子,这时候level就是最后一层了。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Many_question
2011-09-10 · TA获得超过2853个赞
知道大有可为答主
回答量:2040
采纳率:66%
帮助的人:2318万
展开全部
遍历一下,不用递归就广度遍历就好了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式