【问题标题】:How can I can sort binary tree by other parameter?如何按其他参数对二叉树进行排序?
【发布时间】:2018-04-12 16:19:43
【问题描述】:

我正在尝试计算文本中每个单词的出现次数。 所以我已经将所有单词和计数存储在二叉树中:

typedef struct Node{
         char* word;
         int count;
         struct Node *left;
         struct Node *right;
         struct Node *parent;
} Node;

现在我需要按计数对树进行排序。 我不能只做while循环和排序,所以我想知道,我可以用哪种方式来做?

这是我现在拥有的示例:

                               The - 3
                             /       \
                    Project - 1      of - 3
                     /    \          /    \ 
                 ....     ....      ....    ....

我需要打印文本中的前 N ​​个单词。

【问题讨论】:

    标签: c sorting binary-tree


    【解决方案1】:

    遍历树并将单词及其计数提取到这些数组中:

    struct WordAndCount {
      char * word;
      int count;
    };
    

    然后使用qsort 对数组进行排序。您将需要一个自定义比较函数来比较 WordAndCount.count;

    【讨论】:

    • 在我的第一次尝试中,我使用结构数组实现了整个应用程序,但是当我对大量单词进行排序时,它的工作速度非常慢,所以我尝试使用 log(n) 来实现它速度。
    • @VadimTor:这个答案是正确的:您需要第二个数据结构来找到计数最多的 N 个元素。您的二叉树非常适合查找和插入单词,但您以后无法更改排序标准。构建数组和排序很简单,但有better techniques,尤其是当 N 相对于不同单词的数量而言很小时。
    • qsort 的 nlog(n) 速度非常好。 en.wikipedia.org/wiki/Quicksort
    • 是的,但是quickselect 平均有 O(n),(但在最坏的情况下 O(n²))。 qsort 和 quickselect 都有一个缺点,就是需要构建一个大数组。如果 N 很小,最好使用 N 个元素的最小堆,或者只使用插入排序保留 N 个元素的排序数组。这些方法可以说更好,但 qsort 可以开箱即用,因此它是本练习的一个很好的解决方案。
    【解决方案2】:

    您在树中存储项目的标准是什么?是不是左侧节点的计数总是比右侧节点少?如果是这样,要获得前 N 个单词,您需要进行后序遍历,保持一个计数器并在达到 N 时停止它。

    【讨论】:

    • 我认为树是按单词排序的二叉树,这样就很容易找到单词和插入新单词。它是在扫描文本时构建的。 (在示例中,“The”小于“of”,因为它以大写 T 开头。)另一个答案是正确的:您需要第二个数据结构来查找前 k 个元素。
    • 我正在使用 strcmp 函数来比较单词并将它们存储到树中。 @MOehm 猜对了 :)
    猜你喜欢
    • 2015-11-18
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2020-07-19
    相关资源
    最近更新 更多