繁体   English   中英

此功能发生了什么?

[英]What is happening in this function?

我正在寻找一种方法,以按顺序显示二进制搜索树的内容。 我发现这种方法似乎很流行,但是我不明白这种递归是如何工作的。 代码将如何到达cout? 当主函数调用根节点时,也会将根节点传递给该函数。 编辑:这是在考虑“ root!= NULL”。

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

首先,应该使用if (p != null)而不是while(p!=NULL) if (p != null) 否则,如果根节点不为空,则会出现无限循环。

它首先显示左子树,并递归调用display(p->left) 之后,它将显示节点本身( cout<data ),最后显示右子树以递归方式调用display(p->right)

假设您有以下树:

      4
  2       6
1  3     5

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

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)

当为节点“ 1”调用该函数时,它首先通过调用display(p->left)显示左子树。
该函数注意到p==null因此直接返回。
因此,控制权返回到display(1)。
下一个语句是cout << 1
之后,它通过调用display(p->right)来显示右边的子树。
该函数注意到p==null因此直接返回。
因此,控制又返回到display(1)。
此时,display(1)已终止,控制权返回到名为display(1)的函数display(2)。
它完成了对display(p->left)调用(为“ 1”),因此在下一条语句cout << 2执行它。

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

一旦传递给display的参数变为NULL ,即到达树的叶子节点,递归将开始回溯,堆栈将开始展开。最后,控件将返回到display的原始调用。开始执行cout

这就是为什么while(p!=NULL)的判断是必不可少的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM