判断二叉树是否平衡

判断二叉树是否平衡

判断依据,如何判断一棵子树是否平衡

使用递归

  • 左树是否平衡(否,直接返回false)
  • 右树是否平衡(否,直接返回false)
  • 左树、右树都平衡左右树的高度都是多少

代码

#include <iostream>

//节点
struct Node {
    int value;
    Node* parent;
    Node* left;
    Node* right;

    Node(int v = 0): value(v), parent(nullptr), left(nullptr), right(nullptr) {}
};

//销毁二叉树
void destroy_tree(Node* root) {
    if (root == nullptr) {
        return;
    }

    destroy_tree(root->left);
    destroy_tree(root->right);

    delete root;
}

struct Data {
    bool balance;
    int height;

    Data(bool b, int h): balance(b), height(h) {}
};

Data process(Node* &head) {
    if (head == nullptr) {
        return Data(true, 0);
    }

    Data left_data = process(head->left);
    if (!left_data.balance) {
        return Data(false, 0);
    }

    Data right_data = process(head->right);
    if (!right_data.balance) {
        return Data(false, 0);
    }

    if (std::abs(left_data.height - right_data.height) > 1) {
        return Data(false, 0);
    }

    return Data(true, std::max(left_data.height, right_data.height) + 1);
}

bool is_balance(Node* &head) {
    return process(head).balance;
}

int main(void)
{
    //创建一颗平衡树
    Node* head1 = new Node(0);
    Node* node11 = new Node(1);
    Node* node12 = new Node(2);
    head1->left = node11;
    head1->right = node12;

    std::cout << "head1 is balance -----> " << std::boolalpha << is_balance(head1) << std::endl;

    //创建一颗不平衡树
    Node* head2 = new Node(0);
    Node* node21 = new Node(1);
    Node* node22 = new Node(2);
    head2->left = node21;
    node21->left = node22;
    std::cout << "head2 is balance -----> " << std::boolalpha << is_balance(head2) << std::endl;

    destroy_tree(head1);
    destroy_tree(head2);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值