LeetCode之二叉树系列
最近开始认真准备算法了,于是打开了大家都熟悉的算法小抄,摸索着里面高深的刷题方法,最后总结一下作者的意思就是心中想着那几个模板,然后往题目中套着做,而且推荐新手最先刷二叉树系列的题目,我觉得值得一试,于是这两天做了几个二叉树的题目,并且研究了一下,得出下面的二叉树刷题心得,如有错误之处,可以指出哈
我刷了这几个二叉树的题,基本都是可以用递归做出来的,所以对于递归我又有了新的认识,我觉得la哥还是挺有意思的(当然里面还有BFS,DFS)
五道题:
1. 相同的树
2. 对称二叉树
3. 二叉树的最大深度
4. 平衡二叉树
5. 二叉树的层序遍历(Medium)
题目描述我就不贴了,大家去官网上搜就OK了
1. 相同的树
var isSameTree = function(p, q) {
if(q === null && p === null){
return true
}
if(q === null || p === null){
return false
}
if(q.val !== p.val){
return false
}
return isSameTree(q.left,p.left) && isSameTree(q.right,p.right);
};
1. 对称二叉树
因为做这个题之前做了相同的树,所以想了一会儿就有思路了,其实这和相同的树没什么区别,只不过相同的树比较的是两棵树的左子树是不是一样,右子树是不是一样,而这个对称其实就是比较树1的左子树和树2的右子树是不是一样,树1的右子树和树2的左子树是不是一样,所以,你是不是也有思路了……
var isSymmetric = function(root) {
let root1 = root.left;
let root2 = root.right;
if(root1 === null && root2 === null)
return true;
if(root1 === null || root2 === null)
return false;
if(root1.val !== root2.val)
return false;
function isSame(left,right){
if(left === null && right === null)
return true
if(left === null || right === null)
return false
if(left.val !== right.val)
return false
return isSame(left.left,right.right) && isSame(left.right,right.left)
}
return isSame(root1,root2)
};
3. 二叉树的最大深度
这个就比较简单的了。只需要递归计算左右子树的最大的深度,去最大的就行
var maxDepth = function(root) {
if(!root){
return 0;
}else{
const left = maxDepth(root.left);
const right = maxDepth(root.right);
return Math.max(left,right) + 1;
}
};
4. 平衡二叉树
这里涉及什么是平衡二叉树,简单理解就是任意一个节点的左右子树的高度差小于等于1,而好巧不巧,二叉树的高度和深度是一样的,所以前一题的最大深度又可以复用啦……我怀疑我真的是故意找的(不是)
var isBalanced = function(root) {
const maxDepth = function(root) {
if(!root){
return 0;
}else{
const left = maxDepth(root.left);
const right = maxDepth(root.right);
return Math.max(left,right) + 1;
}
};
if(!root)
return true;
return Math.abs(maxDepth(root.left) - maxDepth(root.right)) <= 1
&& isBalanced(root.left) && isBalanced(root.right)
};
4. 二叉树的层序遍历
层序遍历使用递归我是做不出来(递归受挫,刚培养起来的自信瞬间无了),需要使用广度优先遍历(BFS),而之前的最大深度其实也可以算是深度优先遍历(DFS),但是只是使用BFS是解决不了这个问题的,看注释!!!
var levelOrder = function(root) {
let res = [];
let queue = [];
if(root !== null){
queue.push(root);
}
while(queue.length > 0){
let n = queue.length;
let level = [];
for(let i = 0;i < n;i ++){
let node = queue.shift();
level.push(node.val);
if(node.left){
queue.push(node.left);
}
if(node.right){
queue.push(node.right);
}
}
res.push(level);
}
return res;
};
做了之后发现真的很“巧”,感觉做的题都是逐层递进的,通过这几个题,加深了我对递归,DFS,BFS这几个方法的理解,但是不够,还得继续!冲冲冲!
|