代码随想录的第十五天(二叉树)
110. 平衡二叉树
递归法:
var isBalanced = function(root) {
function deep (root) {
if (root === null) return 0
let left = deep(root.left)
if (left === -1) return -1
let right = deep(root.right)
if (right === -1) return -1
if (Math.abs(left - right) <= 1) {
return 1+Math.max(left, right)
} else {
return -1
}
}
return deep(root) !== -1
};
思路:
1、采用后续遍历的思路
2、借鉴求解最大深度思路,首先需要得出左子树和右子树的高度,然后去进行比较,如果是不是平衡二叉树就直接返回-1,否则就返回当前节点的高度
3、如果当前节点的高度是-1的话,说明他已经不是平衡二叉树,就一层层返回到最上面的节点就行
257. 二叉树的所有路径
递归法:
var binaryTreePaths = function(root) {
let res = []
function getPath(root, path) {
if (root.left === null && root.right === null) {
path += root.val
res.push(path)
return
}
path += root.val + '->'
if (root.left) getPath(root.left, path)
if (root.right) getPath(root.right, path)
}
getPath(root, '')
return res
};
思路:
1、首先需要定义传入的参数:当前节点和走完一条的路径的path
2、确定终止条件:就是在遍历到最后左右子节点为空,说明下面没有了,就终止
3、过程:每次进行路径的拼接,在最后一个子节点的时候因为要进行返回了,所以需要拼接上当前的子节点
404. 左叶子之和
递归法
var sumOfLeftLeaves = function(root) {
let sum = 0
function getSum (node) {
if (node === null) return 0
if (node.left === null && node.right === null) return 0
let left = getSum(node.left)
let right = getSum(node.right)
let midValue = 0;
if (node.left !== null && node.left.left === null && node.left.right === null) {
midValue = node.left.val
}
sum = midValue + left + right
return sum
}
getSum(root)
return sum
};
思路:
1、难点是需要确认终止条件:左叶子节点的判断方式是,当前节点有左叶子节点,并且左叶子节点没有左叶子节点和右叶子节点,那么这个左叶子节点就是左叶子节点
2、后续遍历,当当前节点为空返回0
3、根据左叶子节点定义得出左叶子节点的值,然后相加返回