如何用非递归算法求二叉树的高度
收起
知与谁同
2018-07-21 14:23:27
3203
0
2
条回答
写回答
取消
提交回答
-
遍历一下,不用递归就广度遍历就好了
2019-07-17 22:55:42
-
如果是结点的定义中有深度这个属性,那么用一个队列就可以了。
队首放节点 队尾取出节点
比如:根节点放入队列 (开始只有这个一个节点在队列中)
然后呢 从队尾取出这个根节点 然后打散 把他的左右孩子放入对首(这时候有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就是最后一层了。
2019-07-17 22:55:42