總結一下二叉樹的三種遍歷方式,分別爲前序遍歷、中序遍歷、後序遍歷,每種遍歷方式用兩種方法:遞歸遍歷和迭代遍歷數組
1.首先來分析一下二叉樹的前序遍歷spa
前序遍歷首先訪問根節點,而後遍歷左子樹,最後遍歷右子樹。code
如圖所示:blog
遞歸方法以下:遞歸
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,右子節點相同原理,便可前序遍歷出二叉樹; class
迭代方法以下:原理
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;
代碼分析: 用迭代方法遍歷二叉樹, 咱們須要用到棧來保存節點,經過棧先進後出的特性,咱們先把根節點存入棧中,而後步驟以下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變成了左右根 的順序