94. Binary Tree Inorder Traversal

Leetcode

https://leetcode.com/problems/binary-tree-inorder-traversal/

題目

Given the root of a binary tree, return the inorder traversal of its nodes' values.

Example 1:

Input: root = [1,null,2,3]
Output: [1,3,2]

Example 2:

Input: root = []
Output: []

Example 3:

Input: root = [1]
Output: [1]

解答

  • 方法一

Recursion

var inorderTraversal = function(root) {
    if (root === null) return [];
    
    const result = [];
    const inorder = (node) => {
        if(node) {
            inorder(node.left);
            result.push(node.val);
            inorder(node.right);
        }
    }
    inorder(root);
    
    return result;
};

Runtime: 60 ms, faster than 95.03% of JavaScript online submissions for Binary Tree Inorder Traversal.

Memory Usage: 42.3 MB, less than 31.75% of JavaScript online submissions for Binary Tree Inorder Traversal.

  • 方法二

Iteration

var inorderTraversal = function(root) {
    if (root === null) return [];
    
    const result = [];
    const stack = [];
    let curr = root;
    while (curr != null || stack.length) {
      // 一直往左邊找直到找到左子樹為 null
      while(curr != null) {
          stack.push(curr);
          curr = curr.left;
      }
      curr = stack.pop();
      result.push(curr.val);
      curr = curr.right;
    }
    
    return result;
};

Runtime: 96 ms, faster than 38.70% of JavaScript online submissions for Binary Tree Inorder Traversal.

Memory Usage: 42.1 MB, less than 44.91% of JavaScript online submissions for Binary Tree Inorder Traversal.

  • 方法三

Morris method

var inorderTraversal = function(root) {
    if (root === null) return [];
    
    const result = [];
    let curr = root;
    let prev;
    while (curr != null) {
      if(curr.left === null) {
          result.push(curr.val);
          curr = curr.right;
      } else {
          prev = curr.left;
          // 找出左子樹最右邊的節點
          while(prev.right !== null) {
              prev = prev.right;
          }
          // 將 curr 接在左子樹最右邊節點的右邊
          prev.right = curr;
          const temp = curr;
          // 樹根改為左子樹
          curr = curr.left;
          // curr 在接完後,原本的左子樹要清空
          temp.left = null;
      }
    }
    
    return result;
};

Runtime: 73 ms, faster than 71.57% of JavaScript online submissions for Binary Tree Inorder Traversal.

Memory Usage: 42 MB, less than 44.91% of JavaScript online submissions for Binary Tree Inorder Traversal.

參考資料

https://www.cnblogs.com/anniekim/archive/2013/06/15/morristraversal.html

Last updated

Was this helpful?