BST - 删除间隔/删除多个节点

时间:2017-11-23 17:28:13

标签: algorithm merge binary-search-tree

假设我有一个二叉搜索树,其中我应该按照标准输入给我的顺序插入N个唯一编号的键,然后我将删除所有带有键的节点I = [min ,max]以及与这些节点相邻的所有连接。这给了我很多小树,我将以特定方式合并在一起。更准确地描述问题:

给定包含不同密钥的BST和间隔I,间隔删除分两个阶段进行。在第一阶段,它将删除其键位于I中的所有节点以及与删除的节点相邻的所有边缘。让结果图包含k个连通分量T1,...,Tk。每个组件都是BST,其中根是原始BST中该组件的所有节点中具有最小深度的节点。我们假设对树的序列Ti进行排序,使得对于每个i <1。 j Ti中的所有键都小于Tj中的键。在第二阶段期间,树木Ti合并在一起以形成一个BST。我们用Merge(T1,...,Tk)表示这个操作。其输出定期反复定义如下:

编辑:我也应该删除任何连接节点的边缘,它们以给定的间隔分开,这意味着在示例2中,连接节点10和20的边缘被删除,因为间隔[13,15]是&#39 ;在他们之间&#39;从而将它们分开。

对于空的树序列,Merge()给出一个空的BST。 对于包含树T的单元素序列,Merge(T)= T. 对于一系列树T1,...,Tk,其中k> 1。 1,让A1&lt; A2&LT; ......&lt;存储在所有树T1,...,Tk的并集中的密钥序列,按升序排序。设m =⌊(1 + k)/2⌋,Ts为包含Am的树。然后,Merge(T1,...,Tk)给出通过合并三个树Ts,TL = Merge(T1,...,Ts-1)和TR = Merge(Ts + 1,..., TK)。通过建立以下两个链接来合并这些树:TL被附加为存储Ts的最小密钥的节点的左子树,并且TR被附加为存储Ts的最大密钥的节点的右子树。

执行此操作后,我的任务是找到生成的合并树的深度D和深度为D-1的节点数。我的程序应该在几秒钟内完成,即使是一个100000个节点的树(第4个例子)。

我的问题是,我还没有得到如何做到这一点或甚至开始的线索。我设法在删除之前构建所需的树,但那是关于那个。 我很感激能够实施一个程序来解决这个或任何建议。最好是一些C-ish编程语言。

的示例:

输入(第一个数字是要插入空树中的键数,第二个是按给定顺序插入的唯一键,第三行包含两个数字,表示要删除的间隔):

13    
10 5 8 6 9 7 20 15 22 13 17 16 18  
8 16

正确输出程序:3 3,第一个数字是深度D,第二个数量是深度D-1

输入:

13
10 5 8 6 9 7 20 15 22 13 17 16 18
13 15

正确输出:4 3

pictures of the two examples

示例3:https://justpaste.it/1du6l 正确输出:13 6

示例4:link 正确输出:58 9

0 个答案:

没有答案