程序员代码面试指南 3.13:判断二叉树是否为平衡二叉树

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

https://www.nowcoder.com/practice/0d7b90d3cf454062942ff9376e1c8b7e

1、思路

  • 用一个 getDeep 函数计算当前子树的深度;

  • 每次递归都要判断 root 的左右子树是否平衡,并判断以 root 为根节点的子树是否平衡。

2、代码

#include <iostream>

using namespace std;

struct TreeNode
{
    int val;
    TreeNode *left, *right;

    TreeNode(int _val) : val(_val), left(nullptr), right(nullptr) {}
};

void createTree(TreeNode *root, int &n)     //建树
{
    if (n == 0) return;

    int rootVal, leftVal, rightVal;
    cin >> rootVal >> leftVal >> rightVal;

    root->val = rootVal;

    if (leftVal != 0)
    {
        root->left = new TreeNode(leftVal);
        createTree(root->left, -- n);
    }

    if (rightVal != 0)
    {
        root->right = new TreeNode(rightVal);
        createTree(root->right, -- n);
    }
}

int getDeep(TreeNode *root)                     //递归计算当前子树的深度
{
    if (root == nullptr) return 0;

    return max(getDeep(root->left), getDeep(root->right)) + 1;
}

bool isBalanced(TreeNode *root)
{
    if (root == nullptr) return true;

    //递归判断 root 的左右子树是否平衡,并判断以 root 为根节点的子树是否平衡
    return isBalanced(root->left) && isBalanced(root->right) && 
            abs(getDeep(root->left) - getDeep(root->right) <= 1);
}

int main()
{
    int n, rootVal;
    cin >> n >> rootVal;

    TreeNode *root = new TreeNode(rootVal);
    createTree(root, n);

    if (isBalanced(root))
    {
        cout << "true" << endl;
    }
    else
    {
        cout << "false" << endl;
    }

    return 0;
}

主要是为左程云的《程序员代码面试指南》这本书改写C++版的题解。

全部评论

相关推荐

不愿透露姓名的神秘牛友
03-01 23:20
野猪不是猪🐗:美团4000hc就离谱,这是把26实习和25春招的直接加一起了?
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务