判断一棵二叉树是否为平衡二叉树

基于递归判断一棵二叉树是否为平衡二叉树

题目

(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/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值