判断二叉树是否平衡
判断依据,如何判断一棵子树是否平衡
使用递归
- 左树是否平衡(否,直接返回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;
}