我正在尝试在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
}
答案 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
,设置多个样本分割值,并标记哪些节点将保留在新树中。