【问题标题】:Binary Search Tree, In Order Traversal, Step 3 logical assistance二叉搜索树,按顺序遍历,第 3 步逻辑辅助
【发布时间】: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-&gt;Left)PrintInOrderPrivate(Ptr-&gt;Right) 包含在要求Ptr 的-&gt;left-&gt;right 为NULL 以外的值的if 语句中。

我看到并理解了该算法在纸上的工作原理,但是该函数如何不会在像 3 这样左右都为空的数字处中断?它怎么就知道回去了?

即使假设它确实知道返回到包含 2 的节点,它不应该直接返回到 3 吗?

(1)包含2的节点没有左指针 (2) 打印值 (3) 向右走 (正确的意思是再次回到 3 不应该吗?这会循环)。

我的意思是它可以工作,我看到它就在我面前编译,但我无法理解它是如何编译的。我什至可能无法正确说出这个问题,但感谢您提供任何帮助。谢谢你,如果你还在这里,请原谅 tl;dr!

【问题讨论】:

    标签: c++ binary-tree traversal


    【解决方案1】:

    理解递归的最简单方法是考虑一个堆栈,其中每个堆栈帧对应一个函数调用。假设您有函数 func1、func2 和 func3。 func1 调用 func2 和 func2 调用 func3。现在堆栈的目的是跟踪 func3 将控制权分别返回到 func2 和 func2 到 func1 的点。当调用 func1 时,会生成第一个堆栈帧(我们称之为 f1)。当在 func1 内部调用 func2 时,第二帧 f2 被放在 f1 之上。当在 func2 中调用 func3 时,第三帧会放在 f2 之上。当相应的函数完成其任务并将控制权返回给调用它的函数时,堆栈帧会从堆栈中弹出。因此,从堆栈中弹出的帧的顺序是:首先是 f3,然后是 f2,最后是 f1。

    类似地,递归中的函数调用由堆栈结构管理。粗略地说,当递归遍历树时,每个节点都被其成人节点中的函数调用访问。因此,对于每个节点,堆栈上都存在一个对应的帧。因此,算法在遇到两个子节点都等于 NULL 的节点后没有终止的原因是由于堆栈。当一个函数在离开代码的 else 部分后完成时,它会从堆栈中弹出,并将控制权返回到它下面的堆栈帧。

    【讨论】:

      猜你喜欢
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多