拆分二叉树

时间:2011-04-04 00:01:01

标签: java data-structures

我正在尝试在Java的根目录中拆分二叉搜索树。我不知道该怎么做。递归调用最令我困惑的是。下面是我给出的伪代码。当x大于T(要分割的树)时,我是否会调用split(R.key,R.right,L,R)?我是在正确的轨道上吗?这是项目中唯一令我困惑的功能。 提前谢谢。

 void split( int x, bst T, bst L, bst R) /* assuming x is not in T */
 {
    if T is null, make L and R null
    else if x < T.key
      set R = T /* all keys at the root and in right subtree are greater than x */
      recursively split T's left subtree into L and R’s left subtree
         /* some keys in T's left subtree are greater than x, other may be less than x */

    else /* x is greater than T.key */
      set L = T
      recursively split T's right subtree into L's right subtree and R
 }

1 个答案:

答案 0 :(得分:2)

重要的是你必须有一个二进制有序树,这样Left&lt; Root&lt;适用于每个子树。此外,左子树中没有节点,使得节点&gt; Root,并且右子树中没有节点,使节点&lt;根。

。不需要平衡(所有子树都是相同的深度+ - 1)

这就像一个双语搜索;如果要拆分的值大于当前根,则可以确定它大于左子树中的所有节点(因为之前的限制)。因此,为了搜索树的哪个节点更大,您只需要检查右侧的节点。同样,如果要拆分的值小于root的值,它也小于右子树的所有节点的值,并且您必须在左侧树中更精细地检查。

为了清楚地看清楚,我建议你画这棵树(这里没有间距)

8

4 12

3 6 10 14

1 2 5 7 9 11 13 15

,设置多个样本分割值,并标记哪些节点将保留在新树中。