二叉樹的遍曆

來源:互聯網
上載者:User

標籤:else   素數   eve   樹的遍曆   code   while   push   通過   節點   

總結一下二叉樹的三種遍曆方式,分別為前序走訪、中序遍曆、後序遍曆,每種遍曆方式用兩種方法:遞迴遍曆和迭代遍曆

 

1.首先來分析一下二叉樹的前序走訪

  前序走訪首先訪問根節點,然後遍曆左子樹,最後遍曆右子樹。

  :

  

   遞迴方法如下:

1 public List<Integer> preorderTraversal(TreeNode root) {2        List<Integer> list=new ArrayList();3         if(root!=null){4             list.add(root.val);5             list.addAll(preorderTraversal(root.left));6             list.addAll(preorderTraversal(root.right));7         }8         return list;9     }

   程式碼分析:先往集合中插入根節點的值,然後到根的左葉子節點,直到左葉子節點為null,右子節點相同原理,即可前序走訪出二叉樹;  

 

   迭代方法如下:

   

 1 List<Integer> list=new ArrayList(); 2         if(root==null){ 3             return list; 4         } 5        Stack<TreeNode> stack= new Stack(); 6         stack.push(root); 7         while(stack.size()>0){ 8             TreeNode treeNode=stack.pop(); 9             list.add(treeNode.val);10             if(treeNode.right!=null){11                 stack.push(treeNode.right);12             }13             if(treeNode.left!=null){14                 stack.push(treeNode.left);15             }16         }17         return list;

   程式碼分析: 用迭代方法遍曆二叉樹, 我們需要用到棧來儲存節點,通過棧先進後出的特性,我們先把根節點存入棧中,然後步驟如下

      (1)當棧中元素數量大於0時

      (2)取出最上面的棧元素,將其值放入集合中,查看是否有右葉子節點,有的話放入棧中,查看是否有左葉子節點,有的話放入棧中。

      (3)當棧中所有元素均被取出,結束迭代迴圈,返回集合。

2.二叉樹的中序遍曆

  中序遍曆是先遍曆左子樹,然後訪問根節點,然後遍曆右子樹。

  

  遞迴方法如下:

    

1 List<Integer> list=new ArrayList();2         if(root!=null){3             list.addAll(inorderTraversal(root.left));4             list.add(root.val);5             list.addAll(inorderTraversal(root.right));6         }7         return list;

  

  迭代方法如下:

  

 1 List<Integer> list=new ArrayList(); 2        Stack<TreeNode> stack= new Stack(); 3        while(true){ 4            if(root!=null){ 5                stack.push(root); 6                root=root.left; 7            }else{ 8                if(stack.isEmpty()){ 9                    return list;10                }11                TreeNode treeNode =stack.pop();12                list.add(treeNode.val);13                root=treeNode.right;14            }15        }

  

   程式碼分析:

      1.先將左子樹全部壓入棧中,然後取出左子樹的最後一個節點

      2.將彈出的節點的值存入數組中,判斷是否有右子樹節點,壓入棧中,重複1步驟

      3.直到彈出所有棧中節點,返回數組

  3.二叉樹的後序遍曆

    後序遍曆是先遍曆左子樹,然後遍曆右子樹,最後訪問樹的根節點。

    

    遞迴遍曆:

1 List<Integer> list=new ArrayList();2          if(root!=null){3              list.addAll(inorderTraversal(root.left));4              list.addAll(inorderTraversal(root.right)); 5             list.add(root.val);6         }7          return list;            

    迭代方法如下:

List<Integer> list=new ArrayList<Integer> ();        if(root==null){            return list;        }        Stack<TreeNode> stack =new Stack<TreeNode>();        stack.push(root);        while(!stack.isEmpty()){            TreeNode r=stack.pop();            list.add(0,r.val);            if(r.left!=null){                stack.push(r.left);                            }            if(r.right!=null){                stack.push(r.right);            }        }        return list;

    程式碼分析:

     二叉樹後序的迭代遍曆方法和二叉樹前序的迭代遍曆類似,

     通過遍曆根右左的順序 將值插入到list的頭部位置,相當於進行了 reverse  返回的list變成了左右根 的順序

    

  

二叉樹的遍曆

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.