iT邦幫忙

0

LeetCode 94. Binary Tree Inorder Traversal (With Java)

  • 分享至 

  • xImage
  •  

先附上題目連結

問題說明:給定的一棵樹,透過一個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的題目


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言