这个功能发生了什么?

时间:2018-03-26 12:10:21

标签: c++ binary-search-tree

我正在寻找一种在inorder方法中显示二进制搜索树内容的方法。我发现这种方法似乎很受欢迎,但我无法理解这种递归是如何工作的。代码将如何达到cout?当main函数调用时,根节点也被传递给函数。编辑:这是考虑“root!= NULL”。

    void display(struct tree *p)
{
    while(p!=NULL)
    {
        display(p->left);
        cout<<p->data;
        display(p->right);
    }
}

2 个答案:

答案 0 :(得分:6)

首先,您应该使用if (p != null)而不是display(p->left)。否则,如果根节点不为空,则会得到无限循环。

它首先显示左子树递归调用cout<data。之后,它显示节点本身(display(p->right)),最后显示正确的子树,递归调用 4 2 6 1 3 5

假设您有以下树:

display(4)
  display(2)
    display(1)
      display(null)
      cout 1
      display(null)
    cout 2
    display(3)
      display(null)
      cout 3
      display(null)
  cout 4
  display(6)
    display(5)
      display(null)
      cout 5
      display(null)
    cout 6
    display(null)

调用display(root)会导致以下函数调用:

display(p->left)

当为节点“1”调用该函数时,它首先通过调用p==null显示左子树。
该功能通知cout << 1直接返回。
因此控制返回到显示(1) 下一个陈述是display(p->right) 之后,它会通过调用p==null来显示正确的子树 该功能通知display(p->left)直接返回。
再次,控制返回到显示(1) 此时,显示(1)终止并且控制返回到调用显示(1)的功能,即显示(2)。
它完成了对cout << 2(为“1”)的调用,因此执行下一个语句> string1.split("-").first #=> "foo"

答案 1 :(得分:0)

代码到达cout的原因是函数display不会一直递归。

一旦传递给display的参数变为NULL ,也就是说,您已到达该树的叶节点,递归将开始追溯,堆栈将开始展开。最后,控件将返回display的原始调用。它开始执行cout

这就是判断while(p!=NULL)必不可少的原因。