二叉树先序、中序、后续遍历非递归

 1 **
 2      * 二叉树先序遍历非递归
 3      * @param root
 4      */
 5     public void preOrder_no_recursive(TreeNode root){
 6         if(root == null) return;
 7
 8         Stack<TreeNode> stack = new Stack<>();
 9         stack.add(root);
10         while(!stack.isEmpty()){
11             TreeNode tn = stack.pop();
12             System.out.println(tn.val); // 输出
13             if(tn.right != null) stack.add(tn.right);
14             if(tn.left != null)stack.add(tn.left);
15         }
16     }
17
18     /**
19      * 二叉树中序遍历非递归
20      * @param root
21      */
22     public void inOrder_no_recursive(TreeNode root){
23         if(root==null)return;
24         Stack<TreeNode> stk = new Stack<TreeNode>();
25         TreeNode p = root;//辅助节点
26         stk.add(p);
27         while(stk.isEmpty() == false) {
28             //只要你有左孩子,就将左孩子压入栈中
29             if(p!=null &&  p.left!=null) {
30                 stk.add(p.left);
31                 p = p.left;
32             }else {
33                 p = stk.pop();//弹出栈顶节点  左孩子--->根节点
34                 System.out.print(p.val+" ");//访问
35                 if(p!=null && p.right!=null) {//如果栈点元素有右孩子的话,将有节点压入栈中
36                     stk.add(p.right);
37                     p = p.right;
38                 }else
39                     p = null;//p=stk.pop;已经访问过p了,p设置为null
40             }
41         }
42     }
43
44     /**
45      * 二叉树后序遍历非递归
46      * @param root
47      */
48     public void postOrder_no_recursive(TreeNode root){
49         if(root == null)return;
50         TreeNode p = root;
51         TreeNode pVisit = null;
52         Stack<TreeNode> stk = new Stack<TreeNode>();
53         stk.add(p);
54
55         while(stk.isEmpty() == false) {
56             //只要你有左孩子,就将左孩子压入栈中
57             if(p!=null && p.left!=null) {
58                 stk.add(p.left);
59                 p = p.left;
60             }else {
61                 p = stk.peek();//栈顶元素,先出栈,可能还有右孩子
62                 if(p.right==null  || p.right==pVisit) {//如果没有右孩子或右孩子已经访问过了,出栈
63                     System.out.print(p.val+" ");
64                     pVisit = p;//这个很重要,考虑一下只有右孩子的树,得不断的回溯
65                     p = null;//没有新节点加入,继续进行出栈操作
66                     stk.pop();
67                 }else {//如果有右孩子,右孩子入栈
68                     pVisit = p.right;
69                     stk.add(p.right);
70                     p = p.right;
71                 }
72             }
73         }
74     }

原文地址:https://www.cnblogs.com/oldhands/p/11592319.html

时间: 2024-07-31 10:18:23

二叉树先序、中序、后续遍历非递归的相关文章

最容易理解的二叉树后续遍历非递归java实现

后续遍历要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈.如果P不存在左孩子和右孩子,则可以直接访问它:或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点.若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问. java private static void postOrderNonRecursiveEasily(Node root) {

二叉树前序、中序、后序遍历非递归写法的透彻解析

前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历.递归写法,只要理解思想,几行代码.可是非递归写法却很不容易.这里特地总结下,透彻解析它们的非递归写法.其中,中序遍历的非递归写法最简单,后序遍历最难.我们的讨论基础是这样的: //Binary Tree Node typedef struct node { int data; struct node* lchild; //左孩子 struct node* rchild; //右孩子 }BTNode; 首先,有一点是明确的:非递归

二叉树的中序、先序、后序遍历非递归遍历算法(使用堆栈,用循环实现)

1 typedef struct TreeNode *BinTree; 2 typedef BinTree Position; 3 struct TreeNode{ 4 ElementType Data; 5 BinTree Left; 6 BinTree Right; 7 }; 8 BinTree BT; 9 void InOrderTraversal(BinTree BT)//中序遍历非递归遍历算法(使用堆栈,用循环实现) 10 { 11 BinTree T=BT; 12 Stack S=C

二叉树的前序中序后序遍历相互求法

二叉树的前中后序遍历,他们的递归非递归.还有广度遍历,参见二叉树的前中后序遍历迭代&广度遍历和二叉树的前中后序遍历简单的递归 现在记录已知二叉树的前序中序后序遍历的两个,求另外一个.一般,这两个中一定有中序遍历. 1.已知前序和中序,求后序遍历: 前序:ABDECFG  中序:DBEAFCG 思路简单:前序的第一个节点就是根节点, 中序中找到根节点的位置,根节点之前是其左子树,之后是右子树   按此顺序,依次在左子树部分遍历,右子树部分遍历 C++ 代码: TreeNode *BinaryTre

二叉树先序中序非递归算法

一直想要写的 二叉树 中序 先序 后序遍历算法 当年学习DS最虚的就是这个,因为非递归算法复杂,测试数据不好弄,只能一个一个手动插入.感觉明显比图的难,虽然大家都觉得图更难..... 递归的太简单了,就不写了.关键是非递归版本. 先序: 我自己的版本: void RootPreTraverse(Node* p) { Stack S; while(S not empty) { p=S.top(); S.pop(); Show(p); if(p->right!=null) S.push(p->ri

二叉树前序,中序,后序递归和非递归实现

TreeNode定义 1 public class TreeNode { 2 public TreeNode left; 3 public TreeNode right; 4 public int val; 5 6 public TreeNode(int val) { 7 this.val = val; 8 } 9 10 /** 11 * 搞一棵二叉树出来 12 * 1 13 * / 14 * 2 3 15 * \ / 16 * 4 5 6 17 * @return 18 */ 19 publi

算法题——二叉树结点的中序遍历的后继结点

题目:给出二叉树的一个结点,返回它中序遍历顺序的下一个结点. 思路: 如果有指向父亲的结点,则: 如果当前结点有右儿子,或者当前结点是根结点,则后继结点为右子树的最左叶节点: 否则,如果当前结点是父结点的左儿子,则后继结点就是父结点:(其实是第三种情况的一个特例,即自己是第0代祖先,返回第一代祖先) 否则,向上遍历,直到n-1代祖先是n代祖先的左儿子,则后继结点为n代祖先:或者遍历到根节点后未找到符合的n代结点,则该结点为中序遍历的最后结点,没有后继. 时间复杂度为树的高度O(lgN). 代码:

二叉树的先序/中序/后序/层次遍历

[简介] 树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用. 二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用作二叉查找树和二叉堆或是二叉排序树.二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒.二叉树的第i层至多有2的 i -1次方个结点:深度为k的二叉树至多有2^(k) -1个结点:对任何一棵二叉树T,

【基础备忘】 二叉树前序、中序、后序遍历相互求法

转自:http://www.cnblogs.com/fzhe/archive/2013/01/07/2849040.html 今天来总结下二叉树前序.中序.后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明. 首先,我们看看前序.中序.后序遍历的特性: 前序遍历:     1.访问根节点     2.前序遍历左子树     3.前序遍历右子树 中序遍历:     1.中序遍历左子树     2