c++ - 二叉查找树递归显示函数,不知道是怎么实现的?

标签 c++

我有一个 BST,我在网上找到了这个函数,它以正确的顺序打印它,但我不明白如何。

void display()
{
    inOrder(root);
}
void inOrder(treeNode* n)
{
   classA foo;
   if (n != NULL)
   {
        inOrder(n->left);
        foo = *n->item;
        cout << foo << endl << endl;
        inOrder(n->right);
    }
 }

我将每个节点的左侧和右侧初始化为 NULL。为什么if语句在一个NULL指针传入后继续执行,从哪里继续执行?

最佳答案

假设您有以下 BST:

enter image description here

当使用此 BST 调用 inOrder 时,

递归级别 0

n 指向 8。所以你输入 block :

    inOrder(n->left);
    foo = *n->item;
    cout << foo << endl << endl;
    inOrder(n->right);

inOrder 使用 n->left 作为参数调用,即节点 3

递归级别 1

n 指向 3。所以你输入相同的代码块。

inOrder 使用 n->left 作为参数调用,即节点 1

递归级别 2

n 指向 1。所以你输入相同的代码块。

inOrder 使用 n->left 作为参数调用,参数为 NULL

递归级别 3

n 指向 NULL。所以你不要输入上面的代码块。您只需从函数返回即可。现在回到上一个递归级别的下一个语句。

递归级别 2

执行以下几行:

    foo = *n->item;
    cout << foo << endl << endl;
    inOrder(n->right);

你打印1。然后,使用 n->right 作为参数调用 inOrder,参数为 NULL

递归级别 3

n 指向 NULL。所以你不要输入上面的代码块。您只需从函数返回即可。现在回到上一个递归级别的下一个语句。

递归级别 2

没有更多行要执行。该函数只是返回到先前的递归级别。

递归级别 1

执行以下几行:

    foo = *n->item;
    cout << foo << endl << endl;
    inOrder(n->right);

你打印3。然后,使用 n->right 作为参数调用 inOrder,即节点 6

你现在可以一路跟着这个一步一步来了。最终结果是您最终将按以下顺序打印数字。

1
3
4
6
7
8
10
13
14

关于c++ - 二叉查找树递归显示函数,不知道是怎么实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23977034/

相关文章:

c++ - 如何在编译器级别实现 `delete[] obj` 和 `delete obj`

c++ - 如何解析一棵大树?

c++ - 仅带条件的for循环

c++ - 如何知道 QPlainTextEdit 继承类中是否显示水平滚动条?

c++ - 无法正确跟踪鼠标移动,setMouseTracking 无效 - Qt

c++ - 我是否正确实现了 "Heapify"算法?

c++ - HTTP 异常::无法连接到任何解析的端点 - cpprestsdk

c# - 原始数组是否需要整数作为索引

c++ - boost::spirit::qi::phrase_parser() 进入 std::map 错误

c++ - 纹理数组,创建纹理