【问题标题】:Binary search tree Sorting二叉搜索树排序
【发布时间】:2017-01-25 18:56:08
【问题描述】:

我想借助我已经创建的二叉搜索树对一些数据进行排序。 我有以下有效的示例代码..但无法理解这是如何工作的.. 它开始,如果数据库中没有记录,则 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);
}

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

【问题讨论】:

  • 当它到达第一个 NULL 并返回时,它会返回到上次递归调用的位置。这是代码示例中的第 5 行,这意味着它将在第 6 行继续,这是第一个 printf 语句。当你说“但它什么时候打印数据......”时,这就是你要问的吗?

标签: c algorithm binary-search-tree


【解决方案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);
}

这正是您日常工作的结构。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      一开始很迷惑,但是画出来就容易理解了。

      【讨论】:

      • 所以它转到根的左子树。它一直向下直到没有左子树,然后打印该节点。但是循环如何从那里继续打印先前位置的其他节点?
      • display_ordered_email(b->left);根据树的大小,这将被调用多次。前几次调用它之前,它不会做任何事情,直到你回到那个节点。如果它到达一个空节点,那么它将返回到它上面的节点,从而完成“display_ordered_email(b->left);”该底部节点的一部分。因此它将执行该节点的代码: printf("Name : %s\n", b->data->name); ... display_ordered_email(b->right);
      • Hit max characters for comment there sorry but also: "display_ordered_email(b->right); " 做同样的事情来检查正确的节点,如果没有,那么这段代码就完成了它会返回一个节点。请记住,如果正确的节点确实存在,它将再次查找左侧节点,然后是右侧节点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多