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

如题所述

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)当需要退栈时,如果栈为空则结束。

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-09-20
如果是结点的定义中有深度这个属性,那么用一个队列就可以了。
队首放节点 队尾取出节点
比如:根节点放入队列 (开始只有这个一个节点在队列中)
然后呢 从队尾取出这个根节点 然后打散 把他的左右孩子放入对首(这时候有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就是最后一层了。本回答被提问者采纳
第2个回答  2011-09-10
遍历一下,不用递归就广度遍历就好了

如何用非递归算法求二叉树的高度
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];//开...

二叉树的深度算法怎么算啊
} 二、非递归实现基本思想:受后续遍历二叉树思想的启发,想到可以利用后续遍历的方法来求二叉树的深度,在每一次输出的地方替换成算栈S的大小,遍历结束后最大的栈S长度即是栈的深度。算法的执行步骤如下:(1)当树非空时,将指针p指向根节点,p为当前节点指针。(2)将p压入栈S中,0压入栈tag...

python:38.二叉树深度
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。2. 非递归 采用层次遍历的方法,访问每一层。首先构造一个数列,将每一层结点放进去列表中之后再取出,每取出一次计数加1,当列表为空时,计数结束返回count.使用队列实现...

如何不用递归遍历二叉树
非递归的方法是用存储代替计算,就是在建立树时,实现了存储展开,相当于存储了未来需要遍历的路径,所以就快了。递归是送快递,一层层往下递,非递归是先建好区域仓库,由各地仓库储存发货,所以速度更快,但需要仓库储存(内存占用更多)。二叉树遍历在数据结构中用得多,这种算法是从kb时代的内存来的...

跪求!!10分奉上!统计二叉树结点个数的算法 非递归
下面来看一下关于统计二叉树结点个数的非递归算法设计:1、将根结点插入队列。2、判断队列是否为空,非空执行第三步,否则执行第四步退出循环。3、从队列中取出一个结点,同时将取出结点的儿子结点插入队列。此外,将计数器加1,再转到第二步。4、结束循环。注意:队列是先进先出的结构,与栈相反。...

二叉排序树
非递归实现 使用中序遍历,遍历出来的结构刚好是一个升序排列的数列 递归写法 非递归写法 搜索二叉排序树的时候,从根节点开始搜索,将根节点作为当前节点,如果当前节点的值和搜索的值相等,则搜索结束,返回成功;如果当前节点的值小于搜索值,则判断当前节点的左孩子是不是空,如果是空,则搜索的值...

已知二叉树采用链表存储结构,根结点指针为T,请写出计算二叉树中度...
如果度为2,就是所求的。比如用栈的话 push(ST,root)while(not empty(ST)){ node=pop(ST)if(node->left)push(ST,node->left)if(node->right)push(ST,node->right)} 上面的伪代码实际上就是图的深度遍历,二叉树算是一种特殊的图。具体的写法可以搜索一下就可以找到。

二叉树的遍历非递归算法中应注意哪些问题
先序非递归算法 【思路】假设:T是要遍历树的根指针,若T != NULL 对于非递归算法,引入栈模拟递归工作栈,初始时栈为空。问题:如何用栈来保存信息,使得在先序遍历过左子树后,能利用栈顶信息获取T的右子树的根指针?方法1:访问T->data后,将T入栈,遍历左子树;遍历完左子树返回时,栈顶...

层次非递归遍历二叉树算法思想是什么。。。
队列

折半查找的递归和非递归方法
折半查找,又称作二叉搜索,是面试时经常问到的算法问题,今天我们来看一下它的非递归和递归方法.在有序表中,把待查找数据值与查找范围的中间元素值进行比较,会有三种情况出现:1) 待查找数据值与中间元素值正好相等,则放回中间元素值的索引。2) 待查找数据值比中间元素值小,则以整个查找范...

相似回答