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

时间:2017-03-29 10:15:36

标签: 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::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的都会给出错误的答案。请帮我弄清楚它有什么问题。谢谢!

2 个答案:

答案 0 :(得分:0)

很久以前,因为我在C / C ++中做了什么,所以如果可能有一些语法错误。

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

我认为这样做会有所作为。

答案 1 :(得分:0)

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

  1. 为什么要将总和 传递给树?较低的节点不应该关心先前的计数是什么;父母的工作就是积累孩子的计数。看看Casperah的回答是怎么做的?从代码中删除额外的参数;它只是另一个错误来源。
  2. 您的基本案例有一个相同的错误条款:src_root == root&& src_root == nullptr ...如果你进行了有意义的调用,src_root 不能同时 root nullptr
  3. 为什么要与全球价值 root 进行比较?每次通话都会完成自己的工作并返回。当您的调用树爬回到原始调用时,使用root调用它,它只是完成其工作并返回到调用程序。这应该是特例。
  4. 您的 else 子句是错误的:它表示如果 子项为null,则忽略计算另一个子项并且仅返回到目前为止的计数。这保证你会给出错误的答案,除非树是绝对平衡和填充的,N级的总共有2 ^ N - 1个节点。
  5. 按照您发现的任何顺序修复这些项目;这个想法是为了学习。但请注意,您的最终代码应该与Casperah提供的答案非常相似。