声明:
今天是第24道题。给定一个二叉树,判断它是否是高度平衡的二叉树。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除
(手动比心ღ( ´・ᴗ・` ))
正文
题目:给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
示例 1:
给定二叉树
[3,9,20,null,null,15,7]
3 / \ 9 20 / \ 15 7返回True
示例 2:
给定二叉树
[1,2,2,3,3,null,null,4,4]
1 / \ 2 2 / \ 3 3 / \ 4 4返回False
解法1。一定要理清题意,对每一个节点下的子树高度差都不能大于1,不仅仅是父节点要满足此,所有后面跟了子节点的都要验证,所以在isBalanced里如果当前子树满足则返回True,继续递归,直到所有都满足就返回True。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def getHeight(self,root):
if not root:
return 0
left_height = self.getHeight(root.left)
right_height = self.getHeight(root.right)
return 1+max(left_height,right_height)
def isBalanced(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
if not root:
return True
# 计算左右子树的高度并返回更高的高度,check该子树是否是平衡的,是的话返回True,然后继续递归
left = self.getHeight(root.left)
right = self.getHeight(root.right)
if abs(left-right) > 1:
return False
return self.isBalanced(root.left) and self.isBalanced(root.right)
解法2。可以把过程再简化一下,在isBalanced内部定义一个计算子树高度的递归函数,一旦发现左右子树之差大于1或者上一轮验证的左右子树之差大于1则返回-1,最后判断的返回条件是调用此函数后返回值是否为1,是则返回False,否则返回True。
class Solution:
def isBalanced(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
def height(node):
if not node:
return 0
left_height = height(node.left)
right_height = height(node.right)
if left_height == -1 or right_height == -1 or abs(left_height-right_height) > 1:
return -1
return max(left_height,right_height)+1
return height(root) != -1
结尾
解法1:https://blog.csdn.net/u010342040/article/details/80340434
解法2:https://blog.csdn.net/qq_34364995/article/details/80427221