我有一个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指针后继续,以及从哪里继续?
答案 0 :(得分:2)
说你有以下BST:
使用此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->left
,NULL
。
递归级别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