我正在阅读编码书,其中一个问题要求编写一个检查二叉树高度是否平衡的函数。例如,如果一棵树的右子树的高度为4(意味着它的深度为4),而左子树的深度为6,那么它就不平衡,但如果它的关闭为1那么它&# 39;没关系。
所以我实现了这个逻辑:
int FindNodeHeight(BTNode<int>* node) {
if(!node) return 0;
return std::max(FindNodeHeight(node->lhs), FindNodeHeight(node->rhs)) + 1;
}
bool IsTreeBalanced(BinarySearchTree<int>* root) {
int left = FindNodeHeight(root->root.lhs);
int right = FindNodeHeight(root->root.rhs);
std::cout << "left: " << left << " - right: " << right << std::endl;
if(std::abs(left - right) > 1) {
return false;
}
return true;
}
但我认为根据解决方案的解释可能会出错,但我不明白为什么。以下是简化的类:
template <typename T>
// Binary Tree Node
class BTNode {
public:
T data;
BTNode* lhs;
BTNode* rhs;
BTNode() {
lhs = NULL;
rhs = NULL;
}
};
template <typename T>
class BinarySearchTree {
public:
BTNode<T> root;
};
以下是创建图形并调用函数的主要部分:
BinarySearchTree<int>* t_unbalanced = new BinarySearchTree<int>();
t_unbalanced->root.data = 1;
t_unbalanced->root.lhs = new BTNode<int>(2);
t_unbalanced->root.rhs = new BTNode<int>(3);
t_unbalanced->root.rhs->rhs = new BTNode<int>(4);
t_unbalanced->root.rhs->rhs->rhs = new BTNode<int>(5);
if(IsTreeBalanced(t_unbalanced)) {
cout << "Tree is balanced" << endl;
}
else {
cout << "Tree is unbalanced" << endl;
}
答案 0 :(得分:0)
考虑以下情况:
x
/ \
x x
/ \
x x
/ \
x x
/ \
. .
. .
. .
/ \
x x
您的算法表明树是平衡的,因为左树的高度等于右树的高度。但是树的高度为n/2=theta(n)!=O(log(n))
。因此树不平衡。
平衡搜索树是树,其最坏情况下的高度为O(logn),并且操作INSERT,DELETE和SEARCH可以在时间O(logn)中实现。