码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-09-26 16:05:38      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:param   empty   重要   public   回溯   中序   pop   return   print   

 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     }

 

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

标签:param   empty   重要   public   回溯   中序   pop   return   print   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!