题目
(1)给定一个二叉树,判断它是否是高度平衡的二叉树。
(2)本题中,一棵高度平衡二叉树的定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
(3)示例如下:
输入:root = [3,9,20,null,null,15,7]
输出:true
解决思路
- 采用递归思想解决。
- 具体步骤:
- 第一步:递归获取根节点左子树的高度 L。
- 第二步:递归获取根节点右子树的高度 H。
- 第三步:判断是否平衡。如果 H 和 L 之差的绝对值大于1,说明不是平衡树就,此时返回一个负数;如果 H 和 L 的差的绝对值小于等于1,说明是平衡树,返回树的高度。
- 注意:
- 树的高度是 H 和 L 中的最大值再加1。
- 空树也是平衡的。
代码
- C++代码:
# include <stdio.h>
# include <math.h>
# include <algorithm>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(): val(0), left(nullptr), right(nullptr) {}
TreeNode(int _val): val(_val), left(nullptr), right(nullptr) {}
TreeNode(int _val, TreeNode* _left, TreeNode* _right): val(_val), left(_left), right(_right) {}
};
class Solution {
public:
// 获取树的高度,并判读是不是平衡二叉树。
int getHeight(TreeNode* root) {
if (nullptr == root) { // 如果树为空,树的高度为0,注意空树也是平衡树。
return 0;
}
int L = getHeight(root->left); // 第一步:递归获取根节点左子树的树高L。
int H = getHeight(root->right); // 第二步:递归获取根节点右子树的树高H。
// 第三步:判断是否为平衡二叉树。
if (L < 0 || H < 0) { // 左子树或者右子树的高度小于0,说明不是平衡二叉树,返回负数。
return -1;
}
if (abs(L - H) > 1) { // 左右子树的高度差的绝对值大于1,说明不是平衡二叉树,返回负数。
return -1;
}
return max(L, H) + 1; // 返回树的高度。
}
bool isBalanced(TreeNode* root) {
return getHeight(root) >= 0; // 注意:树为空时也是平衡二叉树,因此不能忘记等于0的情况。
}
};
int main() {
TreeNode* n1 = new TreeNode(3);
TreeNode* n2 = new TreeNode(9);
TreeNode* n3 = new TreeNode(20);
TreeNode* n4 = new TreeNode(15);
TreeNode* n5 = new TreeNode(7);
n1->left = n2;
n1->right = n3;
n2->left = nullptr;
n2->right = nullptr;
n3->left = n4;
n3->right = n5;
n4->left = nullptr;
n4->right = nullptr;
n5->left = nullptr;
n5->right = nullptr;
Solution* solution = new Solution();
bool ret = solution->isBalanced(n1);
printf("%d\n", ret);
return 0;
}
- Python代码
# -*- coding: utf-8 -*-
class TreeNode:
def __init__(self, _val=0, _left=None, _right=None):
self.val = _val
self.left = _left
self.right = _right
class Solution:
def __init__(self):
pass
# 获取树的高度,并判读是不是平衡二叉树。
def getHeight(self, root: TreeNode) -> int:
if not root: # 如果树为空,树的高度为0,注意空树也是平衡树。
return 0
L = self.getHeight(root.left) # 第一步:递归获取根节点左子树的树高L。
H = self.getHeight(root.right) # 第二步:递归获取根节点右子树的树高H。
# 第三步:判断是否为平衡二叉树。
if L < 0 or H < 0: # 左子树或者右子树的高度小于0,说明不是平衡二叉树,返回负数。
return -1
if abs(L - H) > 1: # 左右子树的高度差的绝对值大于1,说明不是平衡二叉树,返回负数。
return -1
return max(L, H) + 1 # 返回树的高度。
def isBalanced(self, root: TreeNode) -> bool:
return self.getHeight(root) >= 0 # 注意:树为空时也是平衡二叉树,因此不能忘记等于0的情况。
def main():
n1 = TreeNode(3)
n2 = TreeNode(9)
n3 = TreeNode(20)
n4 = TreeNode(15)
n5 = TreeNode(7)
n1.left = n2
n1.right = n3
n2.left = None
n2.right = None
n3.left = n4
n3.right = n5
n4.left = None
n4.right = None
n5.left = None
n5.right = None
solution = Solution()
print(solution.isBalanced(n1))
if __name__ == "__main__":
main()
说明
- 对应LeetCode第110题。
- LeetCode链接:https://leetcode-cn.com/problems/balanced-binary-tree/