【问题标题】:C++ Improved efficiency to check if a BST is height balanced?C++ 提高了检查 BST 是否高度平衡的效率?
【发布时间】: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 函数中使用它,它的整体复杂性应该会大大增加,对吧?

也就是说,我尝试跟踪每次调用hLhR 时每次增加isOk 的每个子树的高度。

这是我做错了吗? 有错误的地方请指正。

谢谢!

【问题讨论】:

  • 您问的是性能复杂性还是正确的功能?如果是后者(功能),您为什么认为有问题?有什么症状?
  • 我实际上是在问这两个问题。我真的不知道我的功能是否可以两种方式工作。也就是说,我想了解是否我只是做了一个优化删除'height(Node *)'函数。
  • 每个问题一个问题,您可能应该在担心算法的复杂性之前确保算法是正确的。请记住,该网站的存在是为了向未来的读者提供答案。 (获得自己问题的答案是次要的。)当两个不同问题的答案存在于同一页面上时,事情会变得相当混乱。
  • 好的,那么我的主要问题是关于优化,很抱歉让事情变得混乱g!
  • 你在网上搜索过“c++ 平衡二叉树”吗?存在平衡二叉树的现有算法和示例。还要研究红/黑树。

标签: c++ algorithm performance binary-search-tree


【解决方案1】:

可以让isOk 返回一个pair&lt;bool, int&gt;,其中bool 表示返回此值的节点是否遵循所述属性,int 表示它在树中的高度。

假设pair&lt;boor, int&gt; propL, propR分别是当前节点的左右子节点返回的值,则当前节点满足上述属性iffpropL-&gt;first == true &amp;&amp; propR-&gt;first == true &amp;&amp; (int)abs(propL-&gt;second-propR-&gt;second) &lt;= 1。然后这个值连同当前节点的高度(等于max(propL-&gt;second, propR-&gt;second) + 1)将返回给当前节点的父节点。

【讨论】:

  • 很抱歉,我是编程新手,从未使用过 pair 。我会尝试阅读一些关于它的文档。谢谢
猜你喜欢
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
相关资源
最近更新 更多