LeetCode110. 平衡二叉树(树的深度)

1、题目描述

https://leetcode-cn.com/problems/balanced-binary-tree/

给定一个二叉树,判断它是否是高度平衡的二叉树。  本题中,一棵高度平衡二叉树定义为:  

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1

LeetCode110. 平衡二叉树(树的深度)_第1张图片LeetCode110. 平衡二叉树(树的深度)_第2张图片

2、代码详解

最优解:从底至顶(提前阻断)

思路是对二叉树做后序遍历,从底至顶返回子树最大高度,若判定某子树不是平衡树则 “剪枝” ,直接向上返回。

递归推导

  1. 递归到最深处返回0,因为叶子节点的左右节点是空;此时max(left,right)+1=0+1=1 ,+1就是为了计数的,把叶子节点这一层加上
  2. 想象所有递归到最后第一步返回值都是1,然后往上一层想,叶子节点的父节点也会得到{max(left,right)+1} 的返回值
  3. 递归的往上统计树的高度

LeetCode110. 平衡二叉树(树的深度)_第3张图片

https://leetcode-cn.com/problems/balanced-binary-tree/solution/balanced-binary-tree-di-gui-fang-fa-by-jin40789108/

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def isBalanced(self, root):
        return self.helper(root) != -1

    def helper(self, root):
        if not root:
            return 0
        left = self.helper(root.left)
        if left == -1:
            return -1
        right = self.helper(root.right)
        if right == -1:
            return -1
        if abs(left - right) < 2:
            # 返回以节点root为根节点的子树的最大高度
            return max(left, right) + 1  # 即节点 root 的左右子树中最大高度加 1
        else:
            return -1

 

你可能感兴趣的:(Tree,二叉树)