【发布时间】:2020-08-07 02:04:53
【问题描述】:
我正在尝试实现一个函数 isOk(Node*, int&),它检查 BST 的每个节点是否遵循以下属性:
-其左右子树的高度最多可以相差1级。
一个例子可能是:
这是我写的函数:
bool isOk(Node* tree, int& maxH)
{
//if leaf, property is respected
if(!tree->left_ && !tree->right_) return true;
//otherwise
int hL = 0;
int hR = 0;
bool propL = isOk(tree->left_, hL);
bool propR = isOk(tree->right_, hR);
if(propL) hL++;
if(propR) hR++;
if(hL - hR => -1 && hL - hR <= 1) {
maxH = max(hL, hR);
return true;
}
else return false;
}
我们假设结构节点是这样的:
struct Node
{
Node* left_;
Node* right_;
int label_;
//no constructor or destructor, this is not the focus
};
最初我写了这部分:
/*...*/
int hL = 0;
int hR = 0;
bool propL = isOk(tree->left_, hL);
bool propR = isOk(tree->right_, hR);
if(propL) hL++;
if(propR) hR++;
/*...*/
通过以下方式:
int hL = height(tree->left_);
int hR = height(tree->right_);
bool propL = isOk(tree->left_, hL);
bool propR = isOk(tree->right_, hR);
函数height(Node*)在哪里:
int height( Node* tree)
{
if(tree== NULL) return 0;
int leftH = 0;
int rightH = 0;
leftH = height(tree->left_);
rightH = height(tree->right_);
return 1 + max(leftH, rightH);
}
现在,如果我没记错的话,height 的复杂度应该是 O(n)。所以,如果在我的isOk 函数中使用它,它的整体复杂性应该会大大增加,对吧?
也就是说,我尝试跟踪每次调用hL 和hR 时每次增加isOk 的每个子树的高度。
这是我做错了吗? 有错误的地方请指正。
谢谢!
【问题讨论】:
-
您问的是性能复杂性还是正确的功能?如果是后者(功能),您为什么认为有问题?有什么症状?
-
我实际上是在问这两个问题。我真的不知道我的功能是否可以两种方式工作。也就是说,我想了解是否我只是做了一个优化删除'height(Node *)'函数。
-
每个问题一个问题,您可能应该在担心算法的复杂性之前确保算法是正确的。请记住,该网站的存在是为了向未来的读者提供答案。 (获得自己问题的答案是次要的。)当两个不同问题的答案存在于同一页面上时,事情会变得相当混乱。
-
好的,那么我的主要问题是关于优化,很抱歉让事情变得混乱g!
-
你在网上搜索过“c++ 平衡二叉树”吗?存在平衡二叉树的现有算法和示例。还要研究红/黑树。
标签: c++ algorithm performance binary-search-tree