代码随想录day15| 二叉树层序遍历、102二叉树层序遍历、 226.翻转二叉树、101. 对称二叉树

32 阅读2分钟

二叉树层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 LeetCode 102. 二叉树的层序遍历

image.png

一层一层的进行遍历,符合队列先进先出的特性,使用队列存储节点。

  1. 根节点进队列
  2. 当队列不为空时
  3. 记录队列长度len
  4. for len ,队列推出节点node,将node推进层级数组curLevel,并将推出节点的node.left, node.right push 进队列
  5. 每一个for结束时的层级数组里包含这一层的所有node
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[][]}
 */
var levelOrder = function (root) {
    if (root === null) return []
    let queue = [root]
    let res = []
    while (queue.length > 0) {
        const len = queue.length
        let cur = []
        for (let i = 0; i < len; i++) {
            const node = queue.shift()
            cur.push(node.val)
            node.left && queue.push(node.left)
            node.right && queue.push(node.right)
        }
        res.push(cur)
    }
    return res
}

226.翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 image.png

思路: 前序遍历,交换根节点的左右子树,然后分别遍历执行左右子树的交换 先 “做事”——先交换左右子树,它们内部的子树还没翻转——丢给递归去做。
把交换的操作,放在递归子树之前。
问题是在递归压栈前被解决的。

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {TreeNode}
 */

var invertTree = function (root) {
    if (!root) return null;
    //交换根节点
    const temp = root.left
    root.left = root.right
    root.right = temp
    // 递归交换左右子树
    invertTree(root.left)
    invertTree(root.right)
    return root

};

引自LeetCode题解

后序遍历:

image.png

101. 对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。

image.png

image.png

思路1:

层序遍历,将每一层数组进行比较,如果arr[i] === arr[arr.length -1-i],则说明该层对称

思路2:

判断两个子树是否对称,即判断 两个子树根节点的值是否相等,并且左子树的左节点 === 右子树的右节点,并且左子树的右节点 === 右子树的左节点

var isSymmetric = function (root) {
    const isSymmetricTree = (p, q) => {
        if (p === null || q === null) {
            return p === q
        }
        return p.val === q.val && isSymmetricTree(p.left, q.right) && isSymmetricTree(p.right, q.left)
    }
    return isSymmetricTree(root.left, root.right)
}