[英]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.