【问题标题】:Binary Search Tree displaying nodes recursively递归显示节点的二叉搜索树
【发布时间】:2012-04-27 19:10:25
【问题描述】:

我的显示函数处理二叉搜索树时遇到问题。我遇到的主要问题是让 count 变量在递归函数中正确递增,以便我可以按升序对节点进行编号。

让 count 成为全局变量有用吗?

这是函数的代码:

(p指向树的根,count初始设置为1)

void displayAscend(nodePtr p, int count)
   {
      if (p->left != NULL)
         displayAscend(p->left, count);

      cout << count << ". " << p->acctNum << endl;
      count++;

      if (p->right != NULL)
         displayAscend(p->right, count);
   }

【问题讨论】:

  • 你是想显示你在树上走了多少层(在这种情况下,按照 Scott M 的建议做)还是你想单独为每个节点编号……如果是这样,你需要通过引用传递计数...
  • (这看起来像是一个家庭作业问题。如果是这样,你会这样标记它吗?)
  • 我正在尝试单独为每个节点编号,例如 1 表示最少的节点,2 表示第二次的,依此类推...
  • @Tyler 这几乎是正确的,看我的回答。

标签: c++ search recursion tree


【解决方案1】:

通过引用 int& 传递计数。

void displayAscend(nodePtr p, int& count)

【讨论】:

    【解决方案2】:

    改变

    displayAscend(p->left, count);
    

    displayAscend(p->left, count+1);
    

    与包含p-&gt;right的行相同。

    【讨论】:

    • 这将为多个节点打印相同的数字。
    • 抱歉,我以为他希望每个级别都增加它。
    【解决方案3】:

    我怀疑你想要这样的东西:

    size_t displayAscend(nodePtr p, int count)
    {
       size_t additional_count = 0;
       if (p->left != NULL)
          additional_count += displayAscend(p->left, count + additional_count);
    
       cout << count + additional_count << ". " << p->acctNum << endl;
       additional_count++;
    
       if (p->right != NULL)
          additional_count += displayAscend(p->right, count + additional_count);
    
       return additional_count;
    }
    

    如果您愿意,可以使用int 代替size_t

    原因是每个递归调用都必须向其调用者返回一个计数,否则调用者无法知道递归调用计数了多少。当然,最外面的调用者如果不感兴趣,可以直接丢弃计数。

    通过引用传递是另一种方法,正如另一个答案所观察到的那样,尽管不是我喜欢的方式。 (我个人更喜欢使用显式指针来实现 that 策略。)

    您询问将count 设为全局变量是否可行。答案是,是的,它会工作你有限的练习,但它会代表糟糕的编程实践。毕竟,如果你有几棵树,每棵树都有自己的数量呢?

    更新:感谢@JerryCoffin 指出我的代码中的前一个错误。我已经在上面修复了。更重要的是,我已经通过以下方式对其进行了测试:

    #include <vector>
    #include <iostream>
    using std::cout;
    using std::endl;
    
    struct node {
       node *left;
       node *right;
       int acctNum;
    };
    
    typedef node *nodePtr;
    
    size_t displayAscend(nodePtr p, int count)
    {
       size_t additional_count = 0;
       if (p->left != NULL)
          additional_count += displayAscend(p->left, count + additional_count);
    
       cout << count + additional_count << ". " << p->acctNum << endl;
       additional_count++;
    
       if (p->right != NULL)
          additional_count += displayAscend(p->right, count + additional_count);
    
       return additional_count;
    }
    
    int main() {
       node head;
       node n1;
       node n2;
       node n11;
       node n21;
       node n22;
       head.left  = &n1;
       head.right = &n2;
       n1  .left  = &n11;
       n1  .right = 0;
       n2  .left  = &n21;
       n2  .right = &n22;
       n11 .left  = 0;
       n11 .right = 0;
       n21 .left  = 0;
       n21 .right = 0;
       n22 .left  = 0;
       n22 .right = 0;
       n11 .acctNum = 100;
       n1  .acctNum = 202;
       head.acctNum = 300;
       n21 .acctNum = 400;
       n2  .acctNum = 500;
       n22 .acctNum = 600;
       displayAscend(&head, 0);
    }
    

    输出是

    0. 100
    1. 202
    2. 300
    3. 400
    4. 500
    5. 600
    

    所以,它有效。

    【讨论】:

    • @JerryCoffin:好点,我的错误。现在让我来解决这个问题。
    • @JerryCoffin:树递归现在已根据您的建议进行了修复,并且这次也经过了适当的测试。谢谢。
    【解决方案4】:

    您必须通过引用传递计数变量。

    void displayAscend(nodePtr p, int & count)
       {
          if (p->left != NULL)
             displayAscend(p->left, count);
    
          cout << count << ". " << p->acctNum << endl;
          count++;
    
          if (p->right != NULL)
             displayAscend(p->right, count);
       }
    

    【讨论】:

      猜你喜欢
      • 2012-01-26
      • 2018-03-19
      • 2014-01-02
      • 2014-05-10
      • 2013-03-10
      • 2021-07-03
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多