標籤: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變成了左右根 的順序
二叉樹的遍曆