1. 程式人生 > 實用技巧 >LeetCode——二叉樹的前中後序遍歷題解(Java)

LeetCode——二叉樹的前中後序遍歷題解(Java)

目錄

一、題目

1、給定一個二叉樹,返回它的 前序 遍歷。

示例:

輸入: [1,null,2,3]  
   1
    \
     2
    /
   3 

輸出: [1,2,3]

2、給定一個二叉樹,返回它的 中序 遍歷。

示例:

輸入: [1,null,2,3]  
   1
    \
     2
    /
   3 

輸出: [1,3,2]

3、給定一個二叉樹,返回它的 後序 遍歷。

示例:

輸入: [1,null,2,3]  
   1
    \
     2
    /
   3 

輸出: [3,2,1]

二、程式碼

前序遍歷

public class Solution {

	public List<Integer> preorderTraversal(TreeNode root) {
        //建立一個數組l儲存數值
        List<Integer> l = new ArrayList<>();
        preorderTraversal(root, l);
        return l;
    }

    private void preorderTraversal(TreeNode root, List<Integer> l) {
        if (root == null) {
            return;
        }

        //節點值存入陣列
        l.add(root.val);
        preorderTraversal(root.left, l);
        preorderTraversal(root.right, l);
    }

}

中序遍歷

public class Solution {
	
	public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> l = new ArrayList<>();
        inorderTraversal(root, l);
        return l;
    }

    private void inorderTraversal(TreeNode root, List<Integer> l) {
        if (root == null) {
            return;
        }
        inorderTraversal(root.left, l);
        l.add(root.val);
        inorderTraversal(root.right, l);
    }
}

後序遍歷

public class Solution {
	
	public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> l = new ArrayList<>();
        inorderTraversal(root, l);
        return l;
    }

    private void inorderTraversal(TreeNode root, List<Integer> l) {
        if (root == null) {
            return;
        }
        inorderTraversal(root.left, l);
        inorderTraversal(root.right, l);
        l.add(root.val);
    }
}

三、總結

前序遍歷 先遍歷根節點-左子樹-右子樹
先訪問根節點
如果左節點不為空,前序遍歷左節點
如果右節點不為空,前序遍歷右節點
中序遍歷 先遍歷左子樹->根節點->右子樹
如果是遞迴,則遞迴遍歷左子樹,訪問根節點,遞迴遍歷右子樹
非遞迴過程即:先訪問最左子樹結點,再訪問其父節點,再訪問其兄弟
後序遍歷 先遍歷左子樹->右子樹->根節點
先判斷是否空
然後進行遞迴,最後訪問根節點

總的來說,用遞迴來進行遍歷較簡單。