二叉樹先序、中序、后續遍歷非遞歸


 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     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM