Leetcode 第110题:Balanced Binary Tree--平衡二叉树(C++)

题目地址:Balanced Binary Tree


题目简介:

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

Example 1:

Given the following tree [3,9,20,null,null,15,7]:

    3
   / \
  9  20
    /  \
   15   7

Return true.

Example 2:

Given the following tree [1,2,2,3,3,null,null,4,4]:

       1
      / \
     2   2
    / \
   3   3
  / \
 4   4

Return false.

题目解析:

1、遍历:

二叉树的深度问题,简单问题。每到一个点判断一下该点是否满足条件。

C++:

class Solution {
public:
    bool isBalanced(TreeNode* root) {
        if (root == NULL)
            return true;
        if (abs(helper(root -> left) - helper(root -> right)) > 1)
            return false;
        return isBalanced(root -> right) && isBalanced(root -> left);
    }
    int helper(TreeNode* root) {
        if (root == NULL)
            return 0;
        return 1 + max(helper(root -> left), helper(root -> right));
    }
};

Python:

class Solution:
    def isBalanced(self, root: TreeNode) -> bool:
        if root == None:
            return True
        if abs(self.helper(root.left) - self.helper(root.right)) > 1:
            return False
        return self.isBalanced(root.left) and self.isBalanced(root.right)
    def helper(self, root):
        if root == None:
            return 0
        return 1 + max(self.helper(root.left), self.helper(root.right))

2、提前终止

上面的简单法对于越低层的点遍历的次数越多,对于第n层的点遍历了n次。考虑到二叉树的存储结构,其时间效率为O(nlogn)。但是浪费了不必要的时间,只要从下往上看,出现了不符合条件的分支便终止结束即可。

终止的条件是什么呢?根据题目,只要出现左右两端的点不符合层数差别为1,那么便返回错误结果。假设最下面一层的编号为0,每往上走一层加1,那么每层的深度将大于等于0。将不符合条件的节点的深度赋值为-1,就能表示出有错误。

Python:

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

        
    def get_height(self, root):
        if not root: 
            return 0
        left = self.get_height(root.left)
        right = self.get_height(root.right)
        if left == -1 or right == -1 : 
            return -1          
        if abs(left - right) > 1:  
            return -1
        return max(left, right) + 1

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章