【发布时间】:2016-03-26 19:43:51
【问题描述】:
这不是对编码解决方案或编译器错误的请求。我更想理解一些东西。
我学习 C++ 已经有一段时间了,但在某些方面我还是个新手。我正在关注 YouTube 上的 Paul 编程教程以及其他教程。
他制作了一个关于二叉搜索树的顺序遍历概念的 youtube 视频,以及一个展示这种遍历背后的实际编程的 youtube 视频。
如果有人可以帮助我,我不明白第 3 步。
我的示例程序编译和工作正常,打印结果与 Paul 的完全一样。我得到了它的工作并且可以复制它/可能出于打印以外的目的对其进行逆向工程,但我想在继续之前真正理解它。
这是保罗打印函数的代码
void BinarySearchTree::printInOrderPrivate(node* Ptr)
{
if(root_ptr != NULL)
{
if(Ptr->left_ptr != NULL)
{
printInOrderPrivate(Ptr->left_ptr);
}
cout << Ptr->key <<" ";//Process Node here
if(Ptr->right_ptr != NULL)
{
printInOrderPrivate(Ptr->right_ptr);
}
}
else
{
cout <<"The tree is empty\n";
}
}
我只是不明白它是如何在逻辑上工作的。我会链接他的概念视频,你不需要看它,只需暂停它,看看他制作的图表。 https://www.youtube.com/watch?v=pCXgWg5OfhY
在某些节点上,例如 3,左 和 右 ptr 都将指向 NULL。
请注意代码中的递归调用PrintInOrderPrivate(Ptr->Left) 和PrintInOrderPrivate(Ptr->Right) 包含在要求Ptr 的->left 和->right 为NULL 以外的值的if 语句中。
我看到并理解了该算法在纸上的工作原理,但是该函数如何不会在像 3 这样左右都为空的数字处中断?它怎么就知道回去了?
即使假设它确实知道返回到包含 2 的节点,它不应该直接返回到 3 吗?
(1)包含2的节点没有左指针 (2) 打印值 (3) 向右走 (正确的意思是再次回到 3 不应该吗?这会循环)。
我的意思是它可以工作,我看到它就在我面前编译,但我无法理解它是如何编译的。我什至可能无法正确说出这个问题,但感谢您提供任何帮助。谢谢你,如果你还在这里,请原谅 tl;dr!
【问题讨论】:
标签: c++ binary-tree traversal