使用BST的多数元素

时间:2015-04-12 13:04:15

标签: c++ arrays

该问题已在链接中讨论过。 Find the majority element in array

我知道有更多优化的解决方案,但我无法理解下面讨论的方法。顺便说一下,它是一个未排序的阵列。

二进制搜索树的节点(在此方法中使用)如下。

 struct tree
  {
    int element;
    int count;
  }BST;
  

"在BST中逐个插入元素,如果元素已经存在,则递增节点的计数。 "在任何阶段,如果节点的计数变得超过n / 2,则返回。   该方法适用于在数组的起始处存在n / 2 + 1个多数元素的情况,例如{1,1,1,1,1,2,3,4}。

如果我们将元素逐个传递给函数,我们如何比较元素是否已存在并增加计数?

1 个答案:

答案 0 :(得分:0)

首先,struct应该有指向子节点的指针。一些事情

struct node{
 int value;
 int count;
 node *leftChild;
 node *rightChild;
};

要在BST中插入元素,请检查当前节点是大于还是小于或等于您要插入的元素。如果它更小,则向左移动,如果它更大,则向右移动,如果相等则增加该节点的计数字段。如果到达空节点(休假的子节点),则在此位置使用您要插入的值创建一个新节点,并将计数设置为1.

最后有两个变量来跟踪多数元素及其发生的次数,并在插入元素时根据需要更新它们。

假设多数元素确实出现了n / 2或更多次,您不需要额外的变量,但是如您的引用中所述,只要将节点计数器递增为> = n,就可以返回/ 2。因此,无论何时递增计数器,都要与n / 2进行比较。

正如您所指出的,如果任务真的只是最终了解多数元素,那么有更好的解决方案,但我认为您希望坚持BST方法。