二叉樹的遍歷

總結一下二叉樹的三種遍歷方式,分別爲前序遍歷、中序遍歷、後序遍歷,每種遍歷方式用兩種方法:遞歸遍歷和迭代遍歷數組

 

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變成了左右根 的順序

相關文章
相關標籤/搜索