【问题标题】:Find maximum subtree in the given BST such that it has no duplicates在给定的 BST 中找到最大子树,使其没有重复项
【发布时间】:2019-05-31 06:11:06
【问题描述】:

鉴于允许重复作为单独顶点的 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{
    ......
    } 
}

【问题讨论】:

  • 这个问题似乎太简单了,所以我肯定遗漏了一些东西,但是如果根在其 left 子树中重复怎么办?然后,树确实至少有一个重复项,但您可能无法通过仅在其右子树中查找根来检测到这一点。
  • @JohnBollinger 我这样插入:left

标签: c binary-search-tree


【解决方案1】:

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

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

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

但在不修改任何节点本身的情况下,您仍然可以通过其他方式跟踪当前候选者,例如链表。您可以将任何您想要的元数据放入跟踪数据结构中。例如,

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

然后,您可以以广度优先顺序执行树的选择性遍历,携带struct nondupe_subtree 节点的链表:

  • 首先访问根节点。
  • 根据您描述的过程,测试以每个访问节点为根的子树,看它是否包含任何欺骗。
  • 如果是这样,则将其子项排入队列以进行遍历。
  • 如果不是,则测量子树高度并相应地更新您的链表(或不更新)。不要将此节点的子节点排入队列。

当没有更多节点排队等待遍历时,您的链表包含所有最大高度子树的根,没有重复。

请注意,如果您可以在初始 DFS 过程中计算和存储所有子树高度,则该算法在许多情况下会显着加快,否则它很容易执行重复的树高度计算。在某些情况下,其中有很多。

还请注意,虽然它确实简化了这个特定的算法,但您始终将欺骗者放在正确的规则对平衡树不利,这也可能会降低性能。在最坏的情况下,顶点重复的地方,你的“树”将强制是线性的。

【讨论】:

  • 非常感谢您提供如此全面的答案!
猜你喜欢
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 2017-12-02
  • 2013-01-08
  • 1970-01-01
  • 2011-03-10
相关资源
最近更新 更多