我正在尝试在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
}
最佳答案
重要的是,必须有一个二进制有序的树,例如每个子树的Left Root,右侧子树中没有节点,例如节点
这就像双反搜索;如果要分割的值大于当前根,则确保该值大于左子树中的所有节点(由于先前的限制)。因此,为了搜索树中的哪个节点更大,您只需要检查右侧的节点即可。同样,如果要分割的值小于根的值,那么它也小于右子树的所有节点的值,并且必须在左树中进行更精细的检查。
为了清楚地看到它,我建议您绘制这棵树(此处无间距)
8
4 12
3 6 10 14
1 2 5 7 9 11 13 15
,设置几个样本拆分值,并标记哪些节点将保留在新树中。