持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情🚀🚀
110. 平衡二叉树 - 力扣(LeetCode)
后序遍历
var isBalanced = function(root) {
if(!root){
return root
}
let flag = true
const dfs = (root) => {
if(!root)
return 0;
let left = dfs(root.left)
let right = dfs(root.right);
if(Math.abs(left-right) > 1){
flag = false
}
return 1 + Math.max(left,right)
}
dfs(root)
return flag
};
解法和求最大深度很相似,不同的地方就是多了一层判断条件
if(Math.abs(left-right) > 1){
flag = false
}
257. 二叉树的所有路径 - 力扣(LeetCode)
递归
var binaryTreePaths = function(root) {
if(!root)
return root;
let res = [];
let cur = '';
const dfs = (root,cur) => {
if(!root.left && !root.right ){
cur += root.val;
res.push(cur);
return
}
else{
cur += root.val + '->';
root.left && dfs(root.left,cur);
root.right && dfs(root.right,cur)
}
}
dfs(root,cur)
return res
};
1.字符串的拼接和数组的增加不要弄混了,字符串直接用
+拼接2.
root.left && dfs(root.left,cur);一种简写方式3.临界条件的判断
if(!root.left && !root.right ){
cur += root.val;
res.push(cur);
return
}
404. 左叶子之和 - 力扣(LeetCode)
后序遍历
var sumOfLeftLeaves = function(root) {
if(!root)
return root;
const dfs = (root) => {
if(!root)
return 0;
let left = dfs(root.left)
let right = dfs(root.right);
let mid = 0;
if(root.left && root.left.left == null && root.left.right == null){
mid = root.left.val;
}
let sum = left + right + mid;
return sum
}
return dfs(root);
};
难点
这里的难点就是怎样判断是否为左叶子节点?
概念是这样的:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点
这里再放卡哥两张图理解一下
那么下面这张呢?
那么判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。
如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子