【问题标题】:Calculating number of nodes in BST using recursion c++使用递归c ++计算BST中的节点数
【发布时间】:2017-08-22 18:33:04
【问题描述】:

我正在尝试使用递归查找 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 的都给出错误答案。请帮我找出它有什么问题。谢谢!

【问题讨论】:

    标签: recursion binary-search-tree


    【解决方案1】:

    很久以前我用 C/C++ 做任何东西,所以如果有一些语法错误。

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

    我认为这样就可以了。

    【讨论】:

      【解决方案2】:

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

      1. 你为什么要传递sum 向下树?较低的节点不应该关心之前的计数是多少;父母的工作是从孩子那里积累计数。看看 Casperah 的回答是怎么做的?从您的代码中删除额外的参数;这只是另一个错误来源。
      2. 您的基本情况有一个相同的错误子句:src_root==root && src_root==nullptr ...如果您进行有意义的调用,则 src_root 不能同时是 rootnullptr
      3. 您为什么要与全局值进行比较,root?每个调用只是简单地完成自己的工作并返回。当您的调用树爬回原始调用时,即使用根调用的那个,它只是完成它的工作并返回到调用程序。这应该是特例。
      4. 您的 else 子句是错误的:它表示如果 either 子项为空,则您完全忽略另一个子项的计数,只返回到目前为止的计数。这保证了你会给出错误的答案,除非树是绝对平衡和填充的,总共有 2^N - N 个级别的 1 个节点。

      按照您认为有指导意义的任何顺序修复这些项目;这个想法是学习。但是请注意,您的最终代码应该与 Casperah 提供的答案非常相似。

      【讨论】:

        猜你喜欢
        • 2020-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-05
        • 1970-01-01
        • 2021-08-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多