資料結構:二元樹(二叉樹)的中序遍歷(In-order traversal)

中序遍歷

中序遍歷(In-order traversal)是一種遍歷二叉樹的方法,其順序為先遍歷左子樹,然後訪問根節點,最後遍歷右子樹。

下面是中序遍歷的詳細過程:

  1. 如果當前節點為空,則返回。
  2. 對當前節點的左子樹進行中序遍歷,即遞歸調用中序遍歷函數,傳入當前節點的左子節點。
  3. 訪問當前節點,可以進行一些操作,例如將節點的值添加到結果列表中。
  4. 對當前節點的右子樹進行中序遍歷,即遞歸調用中序遍歷函數,傳入當前節點的右子節點。

以下是一個示例來說明中序遍歷的過程。假設我們有以下的二叉樹:

       4
     /   \
    2     6
   / \   / \
  1   3 5   7

按照中序遍歷的順序,我們應該依次訪問節點的值為 1, 2, 3, 4, 5, 6, 7。具體步驟如下:

  1. 從根節點開始遍歷,當前節點為 4。遞歸調用中序遍歷函數,傳入左子節點 2。
  2. 當前節點為 2,遞歸調用中序遍歷函數,傳入左子節點 1。
  3. 當前節點為 1,沒有左子節點,返回到節點 2。將節點 1 的值添加到結果列表中。
  4. 返回到節點 4,將節點 2 的值添加到結果列表中。遞歸調用中序遍歷函數,傳入右子節點 3。
  5. 當前節點為 3,沒有左子節點,返回到節點 4。將節點 3 的值添加到結果列表中。
  6. 返回到節點 4,將節點 4 的值添加到結果列表中。遞歸調用中序遍歷函數,傳入右子節點 6。
  7. 當前節點為 6,遞歸調用中序遍歷函數,傳入左子節點 5。
  8. 當前節點為 5,沒有左子節點,返回到節點 6。將節點 5 的值添加到結果列表中。
  9. 返回到節點 6,將節點 6 的值添加到結果列表中。遞歸調用中序遍歷函數,傳入右子節點 7。
  10. 當前節點為 7,沒有左子節點,返回到節點 6。將節點 7 的值添加到結果列表中。
  11. 返回到節點 6,返回到節點 4。
  12. 返回到根節點 4,遍歷完成。

範例程式碼

以下是一個使用 JavaScript 實現二叉樹中序遍歷的程式碼範例:

// 定義二叉樹的節點
class TreeNode {
  constructor(val, left, right) {
    this.val = val;
    this.left = left;
    this.right = right;
  }
}

// 中序遍歷函數
function inorderTraversal(root) {
  const result = []; // 用於儲存結果的陣列
  inorder(root, result); // 呼叫中序遍歷輔助函數
  return result;
}

// 中序遍歷輔助函數
function inorder(node, result) {
  if (node === null) {
    return;
  }

  // 遞歸遍歷左子樹
  inorder(node.left, result);

  // 將目前節點的值添加到結果陣列中,因為已經沒有比它更小的值了。目前節點的值就是最小的值。
  result.push(node.val);

  // 遞歸遍歷右子樹
  inorder(node.right, result);
}

// 創建二叉樹
/**
 *           4
 *          /  \
 *        2     6
 *       / \    / \
 *      1   3  5   7
 *     / \ / \/ \ / \
 *    n  n n nn n n n
 */
const root = new TreeNode(
    4,
    new TreeNode(2, new TreeNode(1, null, null), new TreeNode(3, null, null)),
    new TreeNode(6, new TreeNode(5, null, null), new TreeNode(7, null, null))
);

// 執行中序遍歷
const inOrderTraversalResult = inorderTraversal(root);
console.log(inOrderTraversalResult); // 輸出 [1, 2, 3, 4, 5, 6, 7]

上述程式碼定義了一個 TreeNode 類別來表示二叉樹的節點,並使用遞歸的方式實現了中序遍歷的函數 inorderTraversal 和輔助函數 inorder。
在主程式中,我們創建了一個二叉樹,並執行中序遍歷,最後將結果輸出到控制台。

請注意,以上範例只是一個示例程式碼,可以根據自己的需求進行修改和擴展。

參考資料 👐

最後,如果你覺得我的分享對你有幫助,請給予我一個愛心,並且分享這篇文章,這將是對我最大的鼓勵!