Algorithm 算法-如何有效地连接两个二叉搜索树?
我不是像这个问题那样询问如何合并两个二叉搜索树 我真的在问如何连接两棵树。所以如果树A的所有节点都比树B的任何节点都小,我们可以连接两棵树。但我如何有效地做到这一点 我的想法是找到树B的最小值,然后让树A成为最小值(树B)的左子树 这很简单,时间是Algorithm 算法-如何有效地连接两个二叉搜索树?,algorithm,data-structures,Algorithm,Data Structures,我不是像这个问题那样询问如何合并两个二叉搜索树 我真的在问如何连接两棵树。所以如果树A的所有节点都比树B的任何节点都小,我们可以连接两棵树。但我如何有效地做到这一点 我的想法是找到树B的最小值,然后让树A成为最小值(树B)的左子树 这很简单,时间是O(B的高度) 但我想这个解决方案有一些问题: 这可能会导致最后一棵大树不再平衡 如果最坏情况下的运行时间是O(h),其中h是两棵树的最大高度,该怎么办 实际上,这本书有这样的附加说明。对于这个练习,我的简单解决方案足够了吗 串联操作采用两个集合S1和
O(B的高度)
但我想这个解决方案有一些问题:
O(h)
,其中h
是两棵树的最大高度,该怎么办谢谢让A成为较小的一组。假设x=最大元素(A),y=最小元素(B) 我们知道x
z=(x+y)/2
的节点,将a作为其左子树,将B作为其右子树。从此BST中删除添加的节点(使用键z
)。我将定义:
=h\u A
A的最大高度
=最大高度h_B
B
h=min(h\u A,h\u B)
O(h\u B)
,当min(B)
的深度为h\u B
时会发生这种情况
该问题要求在最坏情况下使用O(h)
。AO(h)
解决方案更可取,因为如果h\u B
比h\u A
大得多,我们最好将B
附加到max(A)
的右子级,而不是当前的解决方案将A
附加到min(B)
的左子级
以下是如何做到这一点:
A
的右侧和B
的左侧max(A)
或min(B)
时停止遍历max(A)
。在这种情况下,设置max(A)。right=B
min(B)
。在这种情况下,设置min(B)。left=A
max(A)
和min(B)
。在这种情况下,请执行上述任一选项我们最多遍历
h_A
或h_B
步数,以较小者为准。也就是说,h
步骤。将一棵树附加到一个元素是不变的。因此,运行时间是O(h)。很清楚,这比你的答案要好,Jackson,因为它不太可能使事情不平衡。@andrewcooke,是的,你是对的。在这里,只需让答案更清楚:在找到x和y之后,从B中删除y,让y成为新的根,y.right=B.root,y.left=A.root。我想这个描述比涉及tempz节点更清楚。谢谢这个答案有两个问题:1。你不知道哪棵树更小,也无法在O(h)时间内确定。2.这个解要求一个O(h)解,而不考虑平衡。@Tom,我们实际上可以在O(h)
时间内确定,因为h
是两棵树的最大高度。因此,我认为Jackson的答案也是可以接受的,但这一个产生了更好的结果树(在平衡方面)。我也喜欢你关于最小高度的回答,如果在问题中h
被定义为两棵树的最大高度,为什么你有h=min(h\u A,h\u B)
?