C++ 检查BST中每个节点的平衡因子并将其存储在节点中

C++ 检查BST中每个节点的平衡因子并将其存储在节点中,c++,algorithm,tree,binary-search-tree,C++,Algorithm,Tree,Binary Search Tree,我试图编写这个函数,将每个节点的余额存储在BST中,并将其存储在节点中。在我的BST中,我添加了变量bal来存储它 对于递归,我还是一个初学者,所以请原谅我的错误,我只是需要帮助,看看我的逻辑是否正确,或者是否有更好的方法! 以下是我的功能: void calculateBalanceValue(BinaryNode *& t) { if (t==nullptr) return; int left = height(t-

我试图编写这个函数,将每个节点的余额存储在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);

        }

这个逻辑在我看来是合理的,但在我看来,让它大约快一倍是相当简单的

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

因为它无论如何都需要遍历子树来完成它的工作,所以我需要
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的网站,该网站专门介绍这一点。

我觉得这似乎是正确的。
height
也是递归函数调用吗?因为,虽然这是正确的,但你经常做同样的工作。考虑一下你的根的一个孩子。当您为根调用函数时,您将计算此子项的高度,并使用此函数为孙辈调用
height
。现在,当您计算孩子的平衡值时,再次调用孙子的
height
。这并不是真的必要,也许你想用另一种方式来做这件事。另外,不要按ref传递指针,按值传递指针或按ref传递
BinaryNode
。但逻辑是正确的,对我来说似乎是这样。这肯定会遍历所有节点,并将此差异存储在节点中。当然,我不能说
height
方法是否正确,但从局部来看,这个方法是正确的。一个好的做法是为您的树编写一些测试(检查不同的输入与预期结果)。