二叉搜索树递归显示功能,不确定它是如何工作的?

时间:2014-06-01 05:30:12

标签: 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指针后继续,以及从哪里继续?

1 个答案:

答案 0 :(得分:2)

说你有以下BST:

enter image description here

使用此BST调用inOrder时,

递归级别0

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

    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->leftNULL

递归级别3

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

递归级别2

执行以下行:

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

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

递归级别3

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

递归级别2

没有更多行可以执行。该函数只返回上一个递归级别。

递归级别1

执行以下行:

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

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

您现在可以一步一步地完成此操作。最终结果是您将按以下顺序打印数字。

1
3
4
6
7
8
10
13
14