整个递归是一个从底而上的过程!!!!!
1.根节点为空返回0
2.递归求出左右子树高度并且判断左右子树是否为平衡二叉树
3.如果平衡因子的绝对值大于1则判断不为平衡二叉树
4.如果平衡因子小于等于1,则返回左右子树高度的最大值+1(根节点),以此来方便进行下一层递归判断。
举例: root , root->left , root->right (一个根节点具有左右子树)
(1)判断root不为空,跳过。
(2)递归调用judge函数,指向根节点的左结点,将root->left作为参数输入judge,再递归调用judge,于是root->left->left作为参数输入judge,指向空。
(3)判断root为空,将0返回给judge。递归栈返回到上一层,即root->left这一层,此时指向root的左节点。
(4)递归调用judge函数,指向根节点的左节点的右结点,将root->left->right作为参数输入judge,再递归调用judge,于是root->left->right作为参数输入judge,指向空。
(5)判断root为空,返回0,此时我们得到了根节点的左节点的左右子树高度都为空,即root->left->left高度为0,root->left->right高度为0。
(6)判断abs()不大于1,因此左右子树高度加根节点为根节点的左子树的高度,即0 + 0 + 1 = 1,我们就得到递归后的结果,即根节点的左子树的高度为1.
.......
接下来同理我们可以知道,根节点的右子树高度也为1,最后判断根节点的左右子树高度都为1。
class TreeNode:
def __init__(self,left = None, right = None,val = 0):
self.val = val
self.left = left
self.right = right
class Solution:
def judge(self, root:TreeNode):
#根节点为空返回0
if root is None:
return 0
#计算左右子树高度
leftHeight = self.judge(root.left)
if leftHeight == -1:
return -1
rightHeight = self.judge(root.right)
if rightHeight == -1:
return -1
if abs(leftHeight - rightHeight) > 1:
return -1
else:
return max(leftHeight, rightHeight) + 1
def isBalanced(self,root:TreeNode):
if self.judge(root) != -1:
return True
return False
node = TreeNode()
node.left = TreeNode()
node.left.left = TreeNode()
a = Solution()
b = a.isBalanced(node)
print(b)