持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情🚀🚀
102. 二叉树的层序遍历 - 力扣(LeetCode)
var levelOrder = function(root) {
let queue = [];
let res = [];
if(!root) {
return res
}
queue.push(root)
while(queue.length){
let len = queue.length
let level = [];
for(let i = 0;i < len ;i++){
let top = queue.shift();
level.push(top.val);
if(top.left){
queue.push(top.left)
}
if(top.right){
queue.push(top.right)
};
}
res.push(level)
}
return res
};
难点
二叉树的层序遍历,就是模拟一个队列的出队入队过程。
- 边界条件:当队列的长度为空时,表示二叉树已遍历完毕,可以返回最后的
res数组 - 先把队列队头的结点出队,返回的结果为
top,表示队头。 - 判断
top是否有左右子节点,有则将其加入队列。
226. 翻转二叉树 - 力扣(LeetCode)
var invertTree = function(root) {
if(!root){
return root;
}
let left = invertTree(root.left)
let right = invertTree(root.right)
root.right = left;
root.left = right;
return root
};
难点
翻转二叉树,其实就是每一棵子树的左孩子和右孩子都发生了交换。并且这个交换的流程是从下到上。
既然是“每一棵子树”,那么就意味着重复,既然涉及了重复,就没有理由不用递归。
于是这道题解题思路就非常明确了:以递归的方式,遍历树中的每一个结点,并将每一个结点的左右孩子进行交换。
101. 对称二叉树 - 力扣(LeetCode)
var isSymmetric = function(root) {
if(!root)
return root;
const compare = (left,right) =>{
if((left == null && right != null)||(left != null && right == null))
return false;
else if(!left && !right)
return true;
else{
if(left.val != right.val){
return false;
}
}
let out = compare(left.left,right.right)
let In = compare(left.right,right.left)
return out&&In
}
return compare(root.left,root.right)
};
难点
- 对称的关键就是同时比较外侧和内侧二叉树结点
- 同时遍历两颗二叉树
- 处理递归的边界条件
- 左节点为空,右节点不为空,不对称,return false
- 左不为空,右为空,不对称 return false
- 左右都为空,对称,返回true
- 左右都不为空,比较节点数值,不相同就return false