Merge Two BST

来源:互联网 发布:eu域名 编辑:程序博客网 时间:2024/06/05 21:55

You have two BST, you have to merge them into a single BST, inplace and linear time.

struct Node{int val;Node *left;Node *right;Node(int v) : val(v), left(NULL), right(NULL){}};Node* visit(Node *root, Node **leftMin, Node **rightMax){if (root->left == NULL && root->right == NULL){*leftMin = root;*rightMax = root;return root;}Node *result = root;if (root->left){Node *p = NULL;Node *q = NULL;visit(root->left, &p, &q);q->right = root;root->left = q;*leftMin = p;}else{*leftMin = root;}if (root->right){Node *p = NULL;Node *q = NULL;visit(root->right, &p, &q);root->right = p;p->left = root;*rightMax = q;}else{*rightMax = root;}return result;}Node* changeToList(Node *root){Node *left = NULL;Node *right = NULL;visit(root, &left, &right);return left;}Node* mergeList(Node *root1, Node *root2){Node *p = changeToList(root1);Node *q = changeToList(root2);Node *head = NULL;Node *prev = NULL;while (p != NULL && q != NULL){if (head == NULL){if (p->val < q->val){head = p;prev = p;p = p->right;}else{head = q;prev = q;q = q->right;}}else{if (p->val < q->val){prev->right = p;p->left = prev;prev = p;p = p->right;}else{prev->right = q;q->left = prev;prev = q;q = q->right;}}}if (p != NULL){prev->right = p;p->left = prev;}if (q != NULL){prev->right = q;q->left = prev;}return head;}Node* changeToTree(Node *head, int len){if (len < 1){return NULL;}if (len == 1){head->left = NULL;head->right = NULL;return head;}int step = len/2;Node *root = head;while (step > 0){root = root->right;step--;}step = len/2;Node *p = head;Node *q = root->right;root->left = changeToTree(p, step);root->right = changeToTree(q, len-step-1);return root;}Node* fun(Node *root1, Node *root2){Node *head = mergeList(root1, root2);int len = 0;Node *p = head;while (p != NULL){len++;p = p->right;}return changeToTree(head, len);}int main(int argc, char *argv[]){Node a(6), b(4), c(8), d(3), e(5), f(7), g(9);a.left = &b;b.left = &d;b.right = &e;c.left = &f;c.right = &g;Node *p = fun(&a, &c);return 0;    }



0 0