我正在寻找一种在inorder方法中显示二进制搜索树内容的方法。我发现这种方法似乎很受欢迎,但我无法理解这种递归是如何工作的。代码将如何达到cout?当main函数调用时,根节点也被传递给函数。编辑:这是考虑“root!= NULL”。
void display(struct tree *p)
{
while(p!=NULL)
{
display(p->left);
cout<<p->data;
display(p->right);
}
}
答案 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)
必不可少的原因。