顾名思义,每个节点最多有两个 “叉”,也就是两个子节点,分别是左子节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只有左子节点,有的节点只有右子节点

从上到下打印二叉树 I

:point_right: Leetcode 链接在新窗口打开

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。

例如: 给定二叉树:[3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

[3,9,20,15,7]

提示

  • 二叉树的广度优先搜索 (BFS)。
  • BFS 通常借助队列的先入先出特性来实现。
/**
 * 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 levelOrder(root: TreeNode | null): number[] {
    if(!root) return []

    let treeNode: TreeNode[] = [root]
    let results: number[] = []

    while(treeNode.length){
        let currentNode = treeNode.shift()

        results.push(currentNode.val)

        if(currentNode.left){
            treeNode.push(currentNode.left)
        }

        if(currentNode.right){
            treeNode.push(currentNode.right)
        }
    }

    return results
};

从上到下打印二叉树 II

:point_right: Leetcode 链接在新窗口打开

从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

例如: 给定二叉树:[3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

[
  [3],
  [9,20],
  [15,7]
]

提示

  • 按层打印:题目要求的二叉树的从上至下打印 (即按层打印),又称为二叉树的广度优先搜索 (BFS)。BFS 通常借助队列的先入先出特性来实现。

  • 每层打印到一行:将本层全部节点打印到一行,并将下一层全部节点加入队列,以此类推,即可分为多行打印

/**
 * 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 levelOrder(root: TreeNode | null): number[][] {
    let results: number[][] = []
    let quene: TreeNode[] = [root]

    if (!root) return results

    while (quene.length) {
        let temp = []

        for (let i = quene.length; i > 0; i--) {
            let node = quene.shift()
            temp.push(node.val)

            if (node.left) quene.push(node.left)
            if (node.right) quene.push(node.right)
        }

        results.push(temp)
    }

    return results
};

从上到下打印二叉树 III

树的子结构

:point_right: Leetcode 链接在新窗口打开

输入两棵二叉树 A 和 B,判断 B 是不是 A 的子结构。(约定空树不是任意一个树的子结构)

B 是 A 的子结构,即 A 中有出现和 B 相同的结构和节点值。

给定的树 A:

     3
    / \
   4   5
  / \
 1   2

树 B

   4 
  /
 1

返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。

提示

  • 示例 1:

    • 输入:A = [1,2,3],B = [3,1]
    • 输出:false
  • 示例 2:

    • 输入:A = [3,4,5,1,2],B = [4,1]
    • 输出:true
/**
 * 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 isSubStructure(A: TreeNode | null, B: TreeNode | null): boolean {
    return (A !== null && B !== null) && (walkTree(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B))
};

function walkTree(A: TreeNode | null, B: TreeNode | null): boolean {
    if(B === null) return true

    if(A === null || A.val !== B.val) return false

    return walkTree(A.left, B.left) && walkTree(A.right, B.right)
}

二叉树的镜像

:point_right: Leetcode 链接在新窗口打开

请完成一个函数,输入一个二叉树,该函数输出它的镜像。

例如输入:

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

镜像输出:

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

用例

  • 示例 1:
    • 输入:root = [4,2,7,1,3,6,9]
    • 输出:[4,7,2,9,6,3,1]

题目分析

镜像情况

  • 左子树和右子树节点交换

返回条件

  • 子树到达叶子节点,root 为空时
/**
 * 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 mirrorTree(root: TreeNode | null): TreeNode | null {
    if(root === null) return null

    const left = mirrorTree(root.left), right = mirrorTree(root.right)

    root.left = right
    root.right = left

    return root
};

对称二叉树

:point_right: Leetcode 链接在新窗口打开

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1
   / \
  2   2
   \   \
   3    3

用例

  • 示例 1:

    • 输入:root = [1,2,2,3,4,4,3]
    • 输出:true
  • 示例 2:

    • 输入:root = [1,2,2,null,3,null,3]
    • 输出:false

题目分析

对称树情况

  • 左子树的左节点 = 右子树的右节点,左子树的右节点 = 右子树的左节点

返回条件

  • 左右子树都同时到达叶子节点,返回 true
  • 其中一个为空另一个不为空或节点取值不相等,返回 false
/**
 * 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 isSymmetric(root: TreeNode | null): boolean {
    if(root === null) return true

    let left = root.left, right = root.right

    return swap(left, right)
};

function swap(left: TreeNode, right: TreeNode) {
    if(left === null && right === null) return true
    if(left === null || right === null || left.val !== right.val) return false

    return swap(left.left, right.right) && swap(left.right, right.left)
}
上次更新:
贡献者: Joe