110. 平衡二叉树
要求: 给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
思路
递归法
需要比较节点的高度,要用后序遍历,即左右中。
递归三步曲分析:
-
- 明确递归函数的参数和返回值
参数:当前传入节点。 返回值:以当前传入节点为根节点的树的高度。
左右子树差值大于1时,返回-1,意味着二叉树已经不是平衡二叉树了;否则返回高度
-
- 明确终止条件
递归的过程中遇到空节点了则终止,返回0,表示当前节点为根节点的树高度为0
- 明确单层递归的逻辑
判断以当前传入节点为根节点的二叉树是否为平衡二叉树,要比较其左右子树的差值。
分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。
var isBalanced = function(root) {
function getHeight(node){
if(node == null) return 0
let leftHeight = getHeight(node.left)
if(leftHeight == -1 ) return -1
let rightHeight = getHeight(node.right)
if(rightHeight == -1 ) return -1
if(Math.abs(leftHeight-rightHeight)<=1){
return 1+Math.max(leftHeight, rightHeight)
}else{
return -1
}
}
return getHeight(root) == -1 ? false : true
};
257. 二叉树的所有路径
要求:给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
思路
递归+回溯
var binaryTreePaths = function(root) {
let res = []
let path = []
function getRodes(node){
path.push(node.val) //中,要写在前面,因为当前val也必须加入
if(node.left == null && node.right == null){
//终止条件,当到达叶子节点时终止
let tmp = path.join('->')//不能直接操作path,因为后面path需要回溯
res.push(tmp)
return
}
if(node.left) {
getRodes(node.left)
path.pop() //回溯
}
if(node.right) {
getRodes(node.right)
path.pop() //回溯
}
}
getRodes(root)
return res
};
404. 左叶子之和
要求:给定二叉树的根节点 root ,返回所有左叶子之和。
思路
左叶子的定义是节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点,因此我们不是在叶子节点区判断是否符合条件的,而是在左叶子的父节点区判断的。
var sumOfLeftLeaves = function(root) {
let sum = 0
function getLeftValue(node){
if(node == null) return
if(node.left == null && node.right == null) return //叶子节点跳出
if(node.left) getLeftValue(node.left)
//其实是在叶子节点的前一层收集左节点的
if(node.left != null && node.left.left == null && node.left.right == null) {
sum += node.left.val
}
if(node.right) getLeftValue(node.right)
}
getLeftValue(root)
return sum
};