二叉树层序遍历
给你二叉树的根节点 root
,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
LeetCode 102. 二叉树的层序遍历
一层一层的进行遍历,符合队列先进先出的特性,使用队列存储节点。
- 根节点进队列
- 当队列不为空时
- 记录队列长度len
for len
,队列推出节点node
,将node推进层级数组curLevel
,并将推出节点的node.left
,node.right
push
进队列- 每一个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
,翻转这棵二叉树,并返回其根节点。
思路:
前序遍历,交换根节点的左右子树,然后分别遍历执行左右子树的交换
先 “做事”——先交换左右子树,它们内部的子树还没翻转——丢给递归去做。
把交换的操作,放在递归子树之前。
问题是在递归压栈前被解决的。
/**
* 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
};
后序遍历:
101. 对称二叉树
给你一个二叉树的根节点 root
, 检查它是否轴对称。
思路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)
}