输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
示例 1:
示例 2:
限制:
1 <= 树的结点个数 <= 10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof
这道题是二叉树的深度那个题的衍生
一个思路是写一个函数求二叉树的深度,代码和55-1一样,然后再写一个递归遍历该二叉树的所有节点,判断所有节点是不是都左右子树深度不超过1.但这个思路采用自顶向下,容易想到,但是效率比较低。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isBalanced(self, root: TreeNode) -> bool:
def depth(root):
if not root:
return 0
left = 1+depth(root.left)
right = 1+depth(root.right)
return max(left,right)
if not root:
return True
return abs(depth(root.left) - depth(root.right)) <= 1 and \
self.isBalanced(root.left) and self.isBalanced(root.right) #这个三个&条件递归比较难想到
代码来源:作者:jyd 链接:https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof/solution/mian-shi-ti-55-ii-ping-heng-er-cha-shu-cong-di-zhi/
另一种后序剪枝更难想到一些。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isBalanced(self, root: TreeNode) -> bool:
def recur(root):
if not root:
return 0
left = recur(root.left)
if left==-1:
return -1
right = recur(root.right)
if right==-1:
return -1
"""
当前根的二叉树的深度为左右子树最大的深度+1(根) 如果不满足相差小于1的条件就直接返回-1,
左或右-1都直接退出递归。否则就返回当前子树的深度给上一层。如果一直走完返回值为整个二叉树
的深度,遇到不符合条件时则直接返回.
"""
return 1+max(left,right) if abs(left-right)<=1 else -1
return recur(root)!=-1
代码来源:作者:jyd 链接:https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof/solution/mian-shi-ti-55-ii-ping-heng-er-cha-shu-cong-di-zhi/