先附上題目連結
問題說明:給定的一棵樹,透過一個List(Int型態)來儲存此樹中序的遍歷
樹的遍歷(Traversal)可以分成:
1. 前序(Preorder)
2. 中序(Inorder)
3. 後序(Postorder)
4. 層序(Level-order)
此題要探討的是中序的遍歷。
Inorder探討:首先,我們要先拜訪的是左邊的節點,之後再拜訪父節點,最後再拜訪右邊的節點。總體來說,我們每次都要盡可能的走到最左邊,直到左邊沒有節點(也就是Null),之後我們才會到上一層(也就是父節點),接著繼續往右拜訪,順序就是左-->中-->右。用文字來描述可能太過於抽象,以下會用例子來進行說明。
*圖片來源:維基百科的Binary tree
以此圖來說,它的Inorder traversal就是1-->3-->4-->6-->7-->8-->10-->13-->14
說明:從根節點8開始,有左節點3,持續拜訪,而3又有左節點1,但是1沒有節點了,因此1為第一個,之後回到3(第二個),3有右節點6,而6有左節點4,4沒有其他節點(第三個),回到6(第四個),6有右節點7而且7沒有其他節點,因此7在第五個,之後回到6再回到3再回到8,8為第六個,8有右節點10(第七個),10沒有左節點但有右節點14,14有左節點13因此13在第八個回到14,結束此次遍歷。
虛擬碼(表達概念,不同程式語言要考慮其語法轉換)
inorderTraversal(Tree root){
if(root==null) return;
else{
inorderTraversal(root.left);//拜訪左邊節點
print(root.val)//印出root的值,如果是要用list來儲存每個節點的值可以換成 list.add(root.val)
inorderTraversal(root.right);//拜訪右邊節點
}
}
在此題當中,我會使用一個List來儲存樹的資料並運用遞迴概念來進行回傳
程式碼加上說明
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
List<Integer> l=new ArrayList<>();//建立一個List進行儲存
public List<Integer> inorderTraversal(TreeNode root) {
if(root==null){return l;}//如果根節點本身就沒有東西,則直接回傳List l
else{
inorderTraversal(root.left);//拜訪左邊節點
l.add(root.val);//List新增中間節點的值
inorderTraversal(root.right);//拜訪右邊節點
}
return l;//回傳
}
}
之後會持續講解其他LeetCode的題目