【问题标题】:Checking the balance factor of each node in a BST and storing it in the node检查BST中每个节点的平衡因子并将其存储在节点中
【发布时间】:2020-03-16 13:04:56
【问题描述】:

我正在尝试编写此函数,它将每个节点的余额存储在 BST 中并将其存储在节点内。在我的 BST 中,我添加了变量 bal 来存储它。

在递归方面我仍然是初学者,所以请原谅任何错误,我只需要帮助看看我的逻辑是否正确或是否有更好的方法! 这是我的功能:

 void calculateBalanceValue(BinaryNode *& t)
        {
            if (t==nullptr) return;

            int left = height(t->left);
            int right = height(t->right);
            t->bal=abs(left -right);
            calculateBalanceValue(t->right);
            calculateBalanceValue(t->left);

        }

【问题讨论】:

  • 对我来说似乎是正确的。 height 也是递归函数调用吗?因为那时,虽然它是正确的,但你经常做同样的工作。考虑你的根的一个孩子。当您为根调用函数时,您计算这个孩子的高度,并以此为孙子调用height。现在,当您计算孩子的余额值时,您再次为孙子调用height。这并不是真正必要的,也许您想考虑一种不同的方法来做到这一点。另外,不要通过引用传递指针,通过值传递指针或通过引用传递BinaryNode
  • 但是逻辑是对的吧?
  • 在我看来是这样。这肯定会遍历所有节点,并将此差异存储在节点中。我当然不能说height这个方法是否正确,但是在本地这个方法是正确的。一个好的做法是为您的树编写一些测试(检查不同的输入与预期的结果)。

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


【解决方案1】:

逻辑在我看来是合理的,但在我看来,让它大约快两倍是相当微不足道的。

现在,您遍历每个子树一次以计算其高度,然后再次遍历以计算其平衡。

由于无论如何它都需要遍历子树来完成它的工作,我会让calculateBalance 返回树的高度。这样,通过一次遍历计算平衡和高度就相当简单了。

由于我们不想修改传递给这个函数的指针,所以我只是按值传递指针。

int calculateBalanceValue(BinaryNode *t)
    {
        if (t==nullptr) 
            return 0;

        int left = calculateBalance(t->left);
        int right = calculateBalance(t->right);
        t->bal=abs(left -right);
        return 1 + std::max(left, right);
    }

顺便说一句,如果您想对工作代码进行评论,您可能需要查看 Stack Exchange 的 Code Review 网站,该网站专门用于此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    相关资源
    最近更新 更多