二进制搜索树排序

时间:2017-01-25 18:56:09

标签: c algorithm binary-search-tree

我想借助我已创建的二叉搜索树对某些数据进行排序。 我有以下示例代码可以工作..但无法理解这是如何工作的.. 它启动,如果数据库中没有记录,则b = 0并返回。这很清楚。 如果b存在,那么它会转到左侧节点并再次调用该函数,直到b-> left == NULL ..我能正确得到它吗? 但是什么时候打印数据,因为从运行函数时我得到的不打印,但是从函数顶部再次启动..

void display_ordered_email(struct BST_node *b)
{
    if (b==0)           
        return;            
    display_ordered_email(b->left);
    printf("Name    : %s\n", b->data->name);
    printf("Address : %s\n", b->data->address);
    printf("Email   : %s\n", b->data->email);
    printf("\n");
    display_ordered_email(b->right);
}

这是顺序遍历还是其他方法?

3 个答案:

答案 0 :(得分:1)

这是使用递归的预订遍历。完成左子树后,它会打印该子树的根,然后是右子树。您可能希望使用大约8个节点的树进行尝试。

答案 1 :(得分:1)

它将一直遍历到左下角并且命中0.然后它返回一个节点并在return语句之后继续该节点的代码。这意味着它将打印该代码,然后尝试将其用于正确的节点。如果没有正确的节点,它只返回,否则打印正确的节点。然后,如果两者都完成,它将备份一个级别并在那里打印所有内容,然后检查它可能具有的任何分支的右分支。

一开始很混乱,但如果你把它画出来,它就会变得容易理解。

答案 2 :(得分:1)

考虑这个简单的树。

   b
  / \
 a   c

鉴于display_ordered_email应该按顺序递归打印节点,您可以问自己何时应该打印b。答案是b应在访问并打印a(左侧)之后打印,但在它访问并打印c(右侧)之前。

void display_ordered_email(struct BST_node *b)
{
    if (b==0)           
        return;            
    display_ordered_email(b->left);
    /* ... print the node */
    display_ordered_email(b->right);
}

这正是你的例程的结构。