在给定的BST中查找最大子树,使其没有重复项

时间:2019-05-30 21:25:05

标签: c binary-search-tree

鉴于BST允许将重复项作为单独的顶点,我如何找到最高的子树,使其没有重复项。

这是一个主意: (1)检查根值是否出现在其右子树中(以这种方式插入:left

我不知道遍历时如何存储这些信息。我找到了用于查找使用哈希图的BST的所有重复子树的程序,但是如果可能的话,我宁愿避免使用哈希图,因为我还没有在课程中使用它们。

<!-- language: lang-c -->

typedef struct vertex {
    int data;
    struct vertex *left;
    struct vertex *right;
} vertex, *pvertex;

// Utility functions

int Height(pvertex t){
    if (t == NULL)
        return 0;
    if (Height(t->left) > Height(t->right))
        return Height(t->left) + 1;
    else
        return Height(t->right) + 1;
}

int DoesItOccur(pvertex t, int k){
    if(!t)
        return 0;
    if(t->data==k)
        return 1;
    if(t->data<k){
        return DoesItOccur(t->left,k);     
    }
}

// My function
pvertex MaxSeeked(pvertex t){
    if(!t)
        return NULL;
    if(DoesItOccur(t->right,t->data)==0)
        return t;
    else if{
        if(t->left && t->right){
            if(Height(MaxSeeked(t->left))>Height(MaxSeeked(t->right)))
                return t->left;
            else 
                return t->right;
        }
    }
    else if{
    ......
    } 
}

1 个答案:

答案 0 :(得分:0)

  

我不知道遍历时如何存储这些信息。我找到了用于查找使用哈希图的BST的所有重复子树的程序,但是如果可能的话,我宁愿避免使用哈希图,因为我还没有在课程中使用它们。

首先请注意,您只需要跟踪到目前为止发现的最大高度的所有子树。或者,也许您可​​以将其限制为仅此一种,如果这就是您需要发现的全部。为了提高效率,您还应该跟踪最大实际高度。

我假设您不必在节点结构中添加成员,但是如果可以的话,您可以添加一个或两个成员,以记录植根于每个节点的树是否包含任何重复对象以及该树的高度是。您可以随时填充这些数据,并记住最大高度是多少,然后进行第二次遍历以收集节点。

但是无需修改任何节点本身,您仍然可以通过其他方式(例如链表)来跟踪当前候选者。然后,您可以将所需的任何元数据放入跟踪数据结构中。例如,

struct nondupe_subtree {
    struct vertex *root;
    int height;
    struct nondupe_subtree *next;
};

然后,您可以按照广度优先顺序对树进行选择性遍历,并携带struct nondupe_subtree个节点的链接列表:

  • 首先访问根节点。
  • 根据您描述的过程,测试植根于每个访问节点的子树,以查看其是否包含重复对象。
  • 如果是,则让其子级遍历。
  • 如果没有,则测量子树的高度并相应地更新(或不更新)链接列表。不要排队该节点的子节点。

当没有更多的节点排入队列时,链接列表将包含所有没有重复的最大高度子树的根。

请注意,如果您可以在初始DFS通道中计算并存储所有子树的高度,则在很多情况下该算法将大大加快速度,因为否则该算法容易执行重复的树高计算。在某些情况下,其中许多。

还请注意,尽管它确实简化了此特定算法,但始终将重复项置于正确位置的规则对平衡树有效,这也可能导致性能下降。在最坏的情况下,如果顶点重复,则“树”将强制为线性。