平衡二叉树-力扣
思路
- 二叉树的深度:从根节点到该节点的最长简单路径中的结点数
- 二叉树的高度:从该节点到叶子节点的最长简单路径中的结点数
根结点,在leetcode中深度是1,高度==二叉树的最大深度,因此在求二叉树的最大深度时,可以用后序遍历左右中来做;最标准应该是前序遍历中左右求最大深度。 - 本题比较高度,用后序遍历左右中
- 递归要素
1、明确递归函数的参数和返回值
参数:当前传入节点。
返回值:以当前传入节点为根节点的树的高度
若以当前传入结点为根节点的树不是平衡二叉树,返回-1;否则,返回对应高度。
2、明确终止条件
遇到空节点就终止,返回0,表示当前节点为根节点的树高度为0
3、明确单层递归的逻辑
分别求出以当前结点为根节点的左右子树的高度,若差值的绝对值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param pRoot TreeNode类
# @return bool布尔型
#
class Solution:
def IsBalanced_Solution(self , pRoot: TreeNode) -> bool:
# 求高度,后序遍历,递归法
if self.getHeigth(pRoot)==-1:
return False
else:
return True
def getHeigth(self,root) -> int:
#若以该节点为根节点的二叉树不是平衡二叉树,返回-1,若是,返回最大高度
#终止条件,root为空
if not root:
return 0
#左
leftHeight=self.getHeigth(root.left)
if leftHeight==-1:
return -1
#右
rightHeigth=self.getHeigth(root.right)
if rightHeigth==-1:
return -1
#中
if abs(leftHeight - rightHeigth) > 1:
#若高度差绝对值大于1,表示非平衡二叉树
return -1
else:
return 1+max(leftHeight,rightHeigth)