二叉树前序遍历的非递归算法
2018-10-12 14:00
751 查看
二叉树的前序遍历是先根节点,然后如果有左子树则再先序遍历左子树,然后如果有右子树则再先序遍历其又子树。
递归算法如下
当然递归算法是隐式使用了栈。我们仔细分析这个过程,先是取出了根节点进行了访问,然后我们把根节点退栈,退栈后必然有节点进栈,怎么办呢?根节点只能直接访问到rchild和lchild,如果是左子树的根节点进了栈,那么必然是后访问之,所以必然是rchild先进栈,lchild后进栈。可以画图加深理解。
那么现在写出先序遍历二叉树的算法。
递归算法如下
void preorder(Betree *t)
{ if(t==null) return;visit(t);//访问该节点preorder(t->lchild);preorder(t->rchild); }
当然递归算法是隐式使用了栈。我们仔细分析这个过程,先是取出了根节点进行了访问,然后我们把根节点退栈,退栈后必然有节点进栈,怎么办呢?根节点只能直接访问到rchild和lchild,如果是左子树的根节点进了栈,那么必然是后访问之,所以必然是rchild先进栈,lchild后进栈。可以画图加深理解。
那么现在写出先序遍历二叉树的算法。
void preorder(Betree *t)
{ //算法中我们使用一维数组来模拟一个顺序栈
if(t==null) return;//为空树的话完全没有必要进行下面的操作
Betree *stack[max];
top=1;stack[top]=t;//根节点入栈
while(top>0)
{ nd=stack[top];//取出根节点 top=top-1;//退栈 visit(nd->data); //访问根节点 if(nd->rchild!=null) { top=top+1;stack[top]=nd->rchild;} //根节点有右子树,将其进栈,等到左子树访问完后再访问之
if(nd->lchild!=null) { top=top+1;stack[top]=nd->lchild;}
}
}
您可能感兴趣的文章:
相关文章推荐
- 【LeetCode】Binary Tree Preorder Traversal 二叉树前序遍历递归以及非递归算法
- 二叉树前序遍历的非递归算法
- 二叉树前序遍历非递归算法
- Fibonacci(斐波那契)序列的递归和非递归算法
- C/C++面试之算法系列--菲波拉契数列的递归与非递归算法
- 二叉树先序、中序、后序三种遍历的非递归算法
- 进阶--看java做的树的三种非递归算法
- 整数划分的非递归算法(C语言)
- JavaScript斐波纳契数列非递归算法
- 二叉树三种遍历的非递归算法
- 二分查找的递归与非递归算法
- 递归算法转换为非递归算法
- 将一个整数逆序输出,分别给出递归和非递归算法
- 二叉树的中序遍历的非递归算法
- (转载)图的深度优先遍历非递归算法
- 二叉树前序、中序、后序,递归和非递归算法
- Java压缩技术的学习(tar增加非递归算法)
- 二叉树遍历的非递归算法(先序、中序、后序)代码实现
- 二叉树的遍历非递归算法
- 不需要栈的二叉树遍历的非递归算法