110. 平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
示例 1:
输入: root = [3,9,20,null,null,15,7]
输出: true
示例 2:
输入: root = [1,2,2,3,3,null,null,4,4]
输出: false
示例 3:
输入: root = []
输出: true
提示:
节点总数 <= 1000
从底向上递归
思路
跟据题意,任意一个节点的左右子树神帝相差不超过1,则为平衡二叉树
- 首先处理边界条件,根节点为nul直接返回true
从根节点开始递归,在递归的过程中,分别求出其左右子树的深度,如果左右子树的深度并进行比较,如果大于1则返回-1(代表该节点不平衡)
需要一个求深度的函数getDepth:
- 判断传入的节点如果为null则返回深度0
- 获取左右子树的深度,进行比较,如果有一颗为不平衡或者相差超过1则返回-1,代表该节点不平衡
- 如果是平衡的,则返回左右子树深度的最大值再+1,为当前节点的深度
最后可以递归出根节点的深度,如果深度大于0则返回true否则为false
var isBalanced = function(root) {
if (!root) return true
function getDepth(node){
if(node===null){
return 0
}
var leftDepth = getDepth(node.left)
var rightDepth = getDepth(node.right)
if(leftDepth===-1||rightDepth===-1||Math.abs(leftDepth-rightDepth)>1) return -1
return Math.max(leftDepth,rightDepth)+1
}
return getDepth(root)>0
};
从上向下递归
思路
跟据题意,任意一个节点的左右子树神帝相差不超过1,则为平衡二叉树
- 首先处理边界条件,根节点为nul直接返回true
需要一个求深度的函数getDepth,这里我们同归递归来求得一棵树的深度
- 判断传入的节点如果为null则返回深度0
- 否则直接返回左右子树的最大深度并且+1
判断根节点是否为平衡:
- 对比根节点的左右子树
- 同时根节点的左右子树也需要是平衡的(这样就能递归的差距判断每一颗子树是否为平衡二叉树)
递归中有任何一颗不平衡则整个判断为false
var isBalanced = function(root) {
if (!root) return true
function getDepth(node){
if(node===null){
return 0
}
return Math.max(getDepth(node.left), getDepth(node.right))+1
}
return Math.abs(getDepth(root.left)- getDepth(root.right))<=1&&isBalanced(root.left)&&isBalanced(root.right)
};