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

Posted oldhands

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树先序中序后续遍历非递归相关的知识,希望对你有一定的参考价值。

 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     

 

以上是关于二叉树先序中序后续遍历非递归的主要内容,如果未能解决你的问题,请参考以下文章

二叉树先序中序后序遍历 递归与非递归 Python实现

C语言数据结构,急求在线二叉树先序中序后序递归遍历

二叉树的非递归遍历(先序中序后序和层序遍历)

二叉树先序中序后序遍历的非递归实现

数据结构 递归和非递归方式实现二叉树先序中序和后序遍历

二叉树先序中序后序的递归及非递归遍历