Skip to content

144. 二叉树的前序遍历

js
;(function () {
  /**
   * 144. 二叉树的前序遍历 -------- 【根节点——左子树——右子树】
   * 概念: 考察到一个节点后,即刻输出该节点的值,并继续遍历其左右子树。(根左右)
   * --------------------------------------------------------------------------------------------------
   * 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
   * 【概念】二叉树的前序遍历:
   *  按照访问 【根节点——左子树——右子树】 的方式遍历这棵树,而在访问左子树或者右子树的时候,
   *  我们按照同样的方式遍历,直到遍历完整棵树。
   *
   * 输入:root = [1,null,2,3]
   * 输出:[1,2,3]
   *
   * 输入:root = []
   * 输出:[]
   *
   * 输入:root = [1]
   * 输出:[1]
   *
   * 输入:root = [1,2]
   * 输出:[1,2]
   *
   * 输入:root = [1,null,2]
   * 输出:[1,2]
   *
   * 进阶:递归算法很简单,你可以通过迭代算法完成吗?
   */
  /**
   * Definition for a binary tree node.
   */
  class TreeNode {
    val: number
    left: TreeNode | null
    right: TreeNode | null
    constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
      this.val = val === undefined ? 0 : val
      this.left = left === undefined ? null : left
      this.right = right === undefined ? null : right
    }
  }

  function preorderTraversal(root: TreeNode | null): number[] {
    // 方法一:递归
    // let res: number[] = []
    // function preorder (root: TreeNode | null) {
    //     if (!root) return;
    //     res.push(root.val);
    //     preorder(root.left);
    //     preorder(root.right);
    // }
    // preorder(root)
    // return res

    // 方法二: 迭代(官方)
    let res: number[] = []
    let stack: (TreeNode | null)[] = []
    if (root) stack.push(root)
    while (stack.length > 0) {
      const curNode: TreeNode | null = stack.pop() || null
      if (curNode && curNode.val) {
        res.push(curNode.val)
      }
      if (curNode && curNode?.right !== null) {
        stack.push(curNode?.right)
      }
      if (curNode && curNode?.left !== null) {
        stack.push(curNode?.left)
      }
    }
    return res

    // 方法三:Morris 遍历
    // todo......

    // 方法四: 颜色标记法-一种通用且简明的树遍历方法
    /**
         * class Solution:
                def inorderTraversal(self, root: TreeNode) -> List[int]:
                    WHITE, GRAY = 0, 1
                    res = []
                    stack = [(WHITE, root)]
                    while stack:
                        color, node = stack.pop()
                        if node is None: continue
                        if color == WHITE:
                            stack.append((WHITE, node.right))
                            stack.append((GRAY, node))
                            stack.append((WHITE, node.left))
                        else:
                            res.append(node.val)
                    return res

         */
  }
})()