Redian新闻
>
这种解法对吗?merge two BST
avatar
这种解法对吗?merge two BST# JobHunting - 待字闺中
w*o
1
看到很多解法都是in-order遍历两个BST,merge两个array,然后再重构BST,为什么这
么啰嗦?
不能这样直接merge吗?基本思想就是,比较root1和root2,如果root2大的话,把
root2断为两个子树,一个的根是root2的左孩子,另一个是root2及其右子树。把root2
及其右子树与root1的右子树合并,把root2的左孩子与root1继续合并:
Node mergeBST(Node root1, Node root2) {
if (root1 == null || root2 == null)
return root1 == null? root2 : root1;

if (root1.data <= root2.data)
{
Node left = root2.left;
root2.left = null;
root1.right = mergeBST(root1.right, root2);
root1 = mergeBST(root1, left);
} else {
//..........
}

return root1;
}
这样的解法是不对?不快?还是有其它不好?
avatar
l*m
2
我会你这么解,肯定不会merge两个array。

root2

【在 w***o 的大作中提到】
: 看到很多解法都是in-order遍历两个BST,merge两个array,然后再重构BST,为什么这
: 么啰嗦?
: 不能这样直接merge吗?基本思想就是,比较root1和root2,如果root2大的话,把
: root2断为两个子树,一个的根是root2的左孩子,另一个是root2及其右子树。把root2
: 及其右子树与root1的右子树合并,把root2的左孩子与root1继续合并:
: Node mergeBST(Node root1, Node root2) {
: if (root1 == null || root2 == null)
: return root1 == null? root2 : root1;
:
: if (root1.data <= root2.data)

avatar
h*n
3
wrong.
try a few sample cases.

root2

【在 w***o 的大作中提到】
: 看到很多解法都是in-order遍历两个BST,merge两个array,然后再重构BST,为什么这
: 么啰嗦?
: 不能这样直接merge吗?基本思想就是,比较root1和root2,如果root2大的话,把
: root2断为两个子树,一个的根是root2的左孩子,另一个是root2及其右子树。把root2
: 及其右子树与root1的右子树合并,把root2的左孩子与root1继续合并:
: Node mergeBST(Node root1, Node root2) {
: if (root1 == null || root2 == null)
: return root1 == null? root2 : root1;
:
: if (root1.data <= root2.data)

avatar
l*r
4
Wrong, check the BST definition again.

root2

【在 w***o 的大作中提到】
: 看到很多解法都是in-order遍历两个BST,merge两个array,然后再重构BST,为什么这
: 么啰嗦?
: 不能这样直接merge吗?基本思想就是,比较root1和root2,如果root2大的话,把
: root2断为两个子树,一个的根是root2的左孩子,另一个是root2及其右子树。把root2
: 及其右子树与root1的右子树合并,把root2的左孩子与root1继续合并:
: Node mergeBST(Node root1, Node root2) {
: if (root1 == null || root2 == null)
: return root1 == null? root2 : root1;
:
: if (root1.data <= root2.data)

avatar
y*n
6
好神奇= =
avatar
d*e
8
post order遍历tree2,逐个逐个insert到tree1也可行吧。

root2

【在 w***o 的大作中提到】
: 看到很多解法都是in-order遍历两个BST,merge两个array,然后再重构BST,为什么这
: 么啰嗦?
: 不能这样直接merge吗?基本思想就是,比较root1和root2,如果root2大的话,把
: root2断为两个子树,一个的根是root2的左孩子,另一个是root2及其右子树。把root2
: 及其右子树与root1的右子树合并,把root2的左孩子与root1继续合并:
: Node mergeBST(Node root1, Node root2) {
: if (root1 == null || root2 == null)
: return root1 == null? root2 : root1;
:
: if (root1.data <= root2.data)

avatar
g*y
9
你这样解法不对。你不能保证root2左树中的所有node比root1小。

root2

【在 w***o 的大作中提到】
: 看到很多解法都是in-order遍历两个BST,merge两个array,然后再重构BST,为什么这
: 么啰嗦?
: 不能这样直接merge吗?基本思想就是,比较root1和root2,如果root2大的话,把
: root2断为两个子树,一个的根是root2的左孩子,另一个是root2及其右子树。把root2
: 及其右子树与root1的右子树合并,把root2的左孩子与root1继续合并:
: Node mergeBST(Node root1, Node root2) {
: if (root1 == null || root2 == null)
: return root1 == null? root2 : root1;
:
: if (root1.data <= root2.data)

avatar
w*o
10
当然没有假定root2左树中的所有node比root1小.
所以我才用
root1 = mergeBST(root1, left);
而不是:
root1.left = mergeBST(root1.left, left);

【在 g****y 的大作中提到】
: 你这样解法不对。你不能保证root2左树中的所有node比root1小。
:
: root2

avatar
n*n
12
LZ, 我觉得这么修改一些就对了。
void fun(Node roota, Node rootb){
Node x = findRootaInTreeB(roota, rootb);// O(lgn) time
rotateTreeB(rootB,x);//rotate x as the new root of tree B // O(1) time
//continue your algorithm.....
}
时间还是O(n)
avatar
H*s
13
这样可以,只是不保证merge后的树balance. 而且时间是O(nlogn)

【在 d**e 的大作中提到】
: post order遍历tree2,逐个逐个insert到tree1也可行吧。
:
: root2

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。