题目地址: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