Recursion 使用递归c+计算BST中的节点数+;

Recursion 使用递归c+计算BST中的节点数+;,recursion,binary-search-tree,Recursion,Binary Search Tree,我正在尝试使用递归查找BST中的节点数。这是我的密码 struct Node{ int key; struct Node* left; struct Node* right; Node(){ int key = 0; struct Node* left = nullptr; struct Node* right = nullptr; } }; src_root是树的根节点的地址 int BST::coun

我正在尝试使用递归查找BST中的节点数。这是我的密码

struct Node{
    int key;
    struct Node* left;
    struct Node* right;

    Node(){
        int key = 0;
        struct Node* left = nullptr;
        struct Node* right = nullptr;
    }
};
src_root是树的根节点的地址

int BST::countNodes(Node* src_root, int sum){

        if((src_root==root && src_root==nullptr) || src_root==nullptr)
            return 0;
        else if(src_root->left==nullptr || src_root->right==nullptr)
            return sum;
        return countNodes(src_root->left, sum + 1) + countNodes(src_root->right, sum + 1) + 1;
        } 

然而,我的代码似乎只有在有3个节点时才起作用。任何大于3的答案都是错误的。请帮我找出它的毛病。谢谢

我很久没有用C/C++做过任何东西了,所以如果有语法错误的话

int BST::countNodes(Node *scr_root)
{
    if (scr_root == null) return 0;
    return 1 + countNodes(scr_root->left) + countNodes(scr_root->right);
}

我认为这样就可以了。

在实现过程中,您有几个逻辑和结构问题。Casperah给了你一个“干净”的答案,我想你已经在网上找到了(如果你还没有做过那项研究,你就不应该发布你的问题)。因此,你要寻找的不是别人的解决方案,而是如何解决自己的问题

  • 你为什么把sum从树上传下来?较低的节点不应该关心前一个计数是多少;父母的工作是从孩子身上积累计数。看看Casperah的回答是怎么做到的?从代码中删除额外的参数;这只是另一个错误的来源
  • 您的基本情况有一个相同的false子句:src_root==root&&src_root==nullptr。。。如果进行有意义的调用,src_root不能同时是rootnullptr
  • 为什么要将全局值与根进行比较?每个调用只需完成自己的任务并返回。当您的调用树爬行回到原始调用时,即使用根调用的调用,它只执行其工作并返回调用程序。这不应该是特例
  • 您的else子句是错误的:它表示如果其中一个子项为null,则忽略对另一个子项的计数,而只返回到目前为止的计数。这保证了您将给出错误的答案,除非树是绝对平衡和填充的,N个级别总共有2^N-1个节点
  • 按照你认为有指导意义的顺序修复这些项目;这个想法是为了学习。但是,请注意,您的最终代码应该与Casperah提供的答案非常相似