/* coding by Leonardone @ NEETSDKASU */
#include <stdio.h>
#include <stdlib.h>
typedef struct _node {
struct _node *left;
struct _node *right;
int value;
} Node, *LPNode;
LPNode newNode(int value);
void releaseNode(LPNode node);
LPNode addNode(LPNode root, LPNode node);
int nodeDepth(LPNode node);
void calcDepth(LPNode node);
LPNode rotateR(LPNode node);
LPNode rotateL(LPNode node);
int iMax(int a, int b);
void seek(LPNode node) {
if (node == NULL) {
return;
}
printf("depth=%d, value=%d, left=%d, right=%d\n" , nodeDepth(node), node->value
, nodeDepth(node->left), nodeDepth(node->right));
printf("L[%d][%d]\n", nodeDepth
(node
), node
->value
); seek(node->left);
printf("R[%d][%d]\n", nodeDepth
(node
), node
->value
); seek(node->right);
}
void n2bt(LPNode node, int *(*p), int i) {
if (node == NULL || p == NULL) {
return;
}
p[i] = &node->value;
n2bt(node->left, p, (i << 1) + 1);
n2bt(node->right, p, (i << 1) + 2);
}
void space(int n) {
while (n-- > 0) {
}
}
void printTree(LPNode node) {
int *(*a);
int i, j, k;
if (node == NULL) {
return;
}
puts("----------------------------------"); a
= (int*(*))calloc(1 << nodeDepth
(node
), sizeof(int*)); n2bt(node, a, 0);
k = 0;
for (i = 0; i < nodeDepth(node); i++) {
space(2 * (nodeDepth(node) - i));
for (j = 0; j < (1 << i); j++) {
if (a[k] != NULL) {
} else {
}
space(2 * (nodeDepth(node) - i));
k++;
}
}
}
int main(void) {
LPNode root = NULL;
root = addNode(root, newNode(5)); printTree(root);
root = addNode(root, newNode(6)); printTree(root);
root = addNode(root, newNode(9)); printTree(root);
root = addNode(root, newNode(13)); printTree(root);
root = addNode(root, newNode(11)); printTree(root);
root = addNode(root, newNode(19)); printTree(root);
root = addNode(root, newNode(7)); printTree(root);
root = addNode(root, newNode(10)); printTree(root);
root = addNode(root, newNode(8)); printTree(root);
root = addNode(root, newNode(14)); printTree(root);
root = addNode(root, newNode(4)); printTree(root);
root = addNode(root, newNode(3)); printTree(root);
root = addNode(root, newNode(16)); printTree(root);
root = addNode(root, newNode(15)); printTree(root);
root = addNode(root, newNode(2)); printTree(root);
root = addNode(root, newNode(12)); printTree(root);
puts("----------------------------------");
seek(root);
releaseNode(root);
return 0;
}
int iMax(int a, int b) {
return (a > b) ? a : b;
}
LPNode newNode(int value) {
LPNode node
= (LPNode
)malloc(sizeof(Node
)); node->left = NULL;
node->right = NULL;
node->value = value;
return node;
}
void releaseNode(LPNode node) {
if (node == NULL) {
return;
}
if (node->left != NULL) {
releaseNode(node->left);
node->left = NULL;
}
if (node->right != NULL) {
releaseNode(node->right);
node->right = NULL;
}
}
int nodeDepth(LPNode node) {
if (node != NULL) {
return iMax(nodeDepth(node->left), nodeDepth(node->right)) + 1;
} else {
return 0;
}
}
LPNode rotateR(LPNode node) {
LPNode temp1, temp2;
if (node == NULL || node->right == NULL) {
return node;
}
temp1 = node->right;
if (nodeDepth(temp1->left) > nodeDepth(temp1->right)) {
temp2 = temp1->left;
node->right = temp2->left;
temp1->left = temp2->right;
temp2->left = node;
temp2->right = temp1;
return temp2;
} else {
node->right = temp1->left;
temp1->left = node;
return temp1;
}
}
LPNode rotateL(LPNode node) {
LPNode temp1, temp2;
if (node == NULL || node->left == NULL) {
return node;
}
temp1 = node->left;
if (nodeDepth(temp1->left) > nodeDepth(temp1->right)) {
node->left = temp1->right;
temp1->right = node;
return temp1;
} else {
temp2 = temp1->right;
temp1->right = temp2->left;
node->left = temp2->right;
temp2->left = temp1;
temp2->right = node;
return temp2;
}
}
LPNode addNode(LPNode root, LPNode node) {
LPNode temp;
int diff, dl, dr;
if (root == NULL) {
return node;
}
if (node == NULL) {
return root;
}
if (node->value <= root->value) {
root->left = addNode(root->left, node);
} else {
root->right = addNode(root->right, node);
}
dl = nodeDepth(root->left);
dr = nodeDepth(root->right);
diff = dl - dr;
if (diff < -1) {
root = rotateR(root);
} else if (diff > 1) {
root = rotateL(root);
}
return root;
}
LyogY29kaW5nIGJ5IExlb25hcmRvbmUgQCBORUVUU0RLQVNVICovCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+Cgp0eXBlZGVmIHN0cnVjdCBfbm9kZSB7CglzdHJ1Y3QgX25vZGUgKmxlZnQ7CglzdHJ1Y3QgX25vZGUgKnJpZ2h0OwoJaW50IHZhbHVlOwp9IE5vZGUsICpMUE5vZGU7CgpMUE5vZGUgbmV3Tm9kZShpbnQgdmFsdWUpOwp2b2lkIHJlbGVhc2VOb2RlKExQTm9kZSBub2RlKTsKTFBOb2RlIGFkZE5vZGUoTFBOb2RlIHJvb3QsIExQTm9kZSBub2RlKTsKaW50IG5vZGVEZXB0aChMUE5vZGUgbm9kZSk7CnZvaWQgY2FsY0RlcHRoKExQTm9kZSBub2RlKTsKTFBOb2RlIHJvdGF0ZVIoTFBOb2RlIG5vZGUpOwpMUE5vZGUgcm90YXRlTChMUE5vZGUgbm9kZSk7CgppbnQgaU1heChpbnQgYSwgaW50IGIpOwoKdm9pZCBzZWVrKExQTm9kZSBub2RlKSB7CglpZiAobm9kZSA9PSBOVUxMKSB7CgkJcmV0dXJuOwoJfQoJcHJpbnRmKCJkZXB0aD0lZCwgdmFsdWU9JWQsIGxlZnQ9JWQsIHJpZ2h0PSVkXG4iCgkJLCBub2RlRGVwdGgobm9kZSksIG5vZGUtPnZhbHVlCgkJLCBub2RlRGVwdGgobm9kZS0+bGVmdCksIG5vZGVEZXB0aChub2RlLT5yaWdodCkpOwoJcHJpbnRmKCJMWyVkXVslZF1cbiIsIG5vZGVEZXB0aChub2RlKSwgbm9kZS0+dmFsdWUpOwoJc2Vlayhub2RlLT5sZWZ0KTsKCXByaW50ZigiUlslZF1bJWRdXG4iLCBub2RlRGVwdGgobm9kZSksIG5vZGUtPnZhbHVlKTsKCXNlZWsobm9kZS0+cmlnaHQpOwp9Cgp2b2lkIG4yYnQoTFBOb2RlIG5vZGUsIGludCAqKCpwKSwgaW50IGkpIHsKCWlmIChub2RlID09IE5VTEwgfHwgcCA9PSBOVUxMKSB7CgkJcmV0dXJuOwoJfQoJcFtpXSA9ICZub2RlLT52YWx1ZTsKCW4yYnQobm9kZS0+bGVmdCwgcCwgKGkgPDwgMSkgKyAxKTsKCW4yYnQobm9kZS0+cmlnaHQsIHAsIChpIDw8IDEpICsgMik7Cn0KCnZvaWQgc3BhY2UoaW50IG4pIHsKCXdoaWxlIChuLS0gPiAwKSB7CgkJcHV0Y2hhcignICcpOwoJfQp9Cgp2b2lkIHByaW50VHJlZShMUE5vZGUgbm9kZSkgewoJaW50ICooKmEpOwoJaW50IGksIGosIGs7CglpZiAobm9kZSA9PSBOVUxMKSB7CgkJcmV0dXJuOwoJfQoJcHV0cygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwoJYSA9IChpbnQqKCopKWNhbGxvYygxIDw8IG5vZGVEZXB0aChub2RlKSwgc2l6ZW9mKGludCopKTsKCW4yYnQobm9kZSwgYSwgMCk7CglrID0gMDsKCWZvciAoaSA9IDA7IGkgPCBub2RlRGVwdGgobm9kZSk7IGkrKykgewoJCXNwYWNlKDIgKiAobm9kZURlcHRoKG5vZGUpIC0gaSkpOwoJCWZvciAoaiA9IDA7IGogPCAoMSA8PCBpKTsgaisrKSB7CgkJCWlmIChhW2tdICE9IE5VTEwpIHsKCQkJCXByaW50ZigiJTJkIiwgKmFba10pOwoJCQl9IGVsc2UgewoJCQkJcHJpbnRmKCItLSIpOwoJCQl9CgkJCXNwYWNlKDIgKiAobm9kZURlcHRoKG5vZGUpIC0gaSkpOwoJCQlrKys7CgkJfQoJCXB1dGNoYXIoJ1xuJyk7Cgl9CglmcmVlKGEpOwp9CgppbnQgbWFpbih2b2lkKSB7CgkKCUxQTm9kZSByb290ID0gTlVMTDsKCQoJcm9vdCA9IGFkZE5vZGUocm9vdCwgbmV3Tm9kZSg1KSk7IHByaW50VHJlZShyb290KTsKCXJvb3QgPSBhZGROb2RlKHJvb3QsIG5ld05vZGUoNikpOyBwcmludFRyZWUocm9vdCk7Cglyb290ID0gYWRkTm9kZShyb290LCBuZXdOb2RlKDkpKTsgcHJpbnRUcmVlKHJvb3QpOwoJcm9vdCA9IGFkZE5vZGUocm9vdCwgbmV3Tm9kZSgxMykpOyBwcmludFRyZWUocm9vdCk7Cglyb290ID0gYWRkTm9kZShyb290LCBuZXdOb2RlKDExKSk7IHByaW50VHJlZShyb290KTsKCXJvb3QgPSBhZGROb2RlKHJvb3QsIG5ld05vZGUoMTkpKTsgcHJpbnRUcmVlKHJvb3QpOwoJcm9vdCA9IGFkZE5vZGUocm9vdCwgbmV3Tm9kZSg3KSk7IHByaW50VHJlZShyb290KTsKCXJvb3QgPSBhZGROb2RlKHJvb3QsIG5ld05vZGUoMTApKTsgcHJpbnRUcmVlKHJvb3QpOwoJcm9vdCA9IGFkZE5vZGUocm9vdCwgbmV3Tm9kZSg4KSk7IHByaW50VHJlZShyb290KTsKCXJvb3QgPSBhZGROb2RlKHJvb3QsIG5ld05vZGUoMTQpKTsgcHJpbnRUcmVlKHJvb3QpOwoJcm9vdCA9IGFkZE5vZGUocm9vdCwgbmV3Tm9kZSg0KSk7IHByaW50VHJlZShyb290KTsKCXJvb3QgPSBhZGROb2RlKHJvb3QsIG5ld05vZGUoMykpOyBwcmludFRyZWUocm9vdCk7Cglyb290ID0gYWRkTm9kZShyb290LCBuZXdOb2RlKDE2KSk7IHByaW50VHJlZShyb290KTsKCXJvb3QgPSBhZGROb2RlKHJvb3QsIG5ld05vZGUoMTUpKTsgcHJpbnRUcmVlKHJvb3QpOwoJcm9vdCA9IGFkZE5vZGUocm9vdCwgbmV3Tm9kZSgyKSk7IHByaW50VHJlZShyb290KTsKCXJvb3QgPSBhZGROb2RlKHJvb3QsIG5ld05vZGUoMTIpKTsgcHJpbnRUcmVlKHJvb3QpOwoKCXB1dHMoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKCglzZWVrKHJvb3QpOwoJCglyZWxlYXNlTm9kZShyb290KTsKCQoJcmV0dXJuIDA7Cn0KCgppbnQgaU1heChpbnQgYSwgaW50IGIpIHsKCXJldHVybiAoYSA+IGIpID8gYSA6IGI7Cn0KCkxQTm9kZSBuZXdOb2RlKGludCB2YWx1ZSkgewoJTFBOb2RlIG5vZGUgPSAoTFBOb2RlKW1hbGxvYyhzaXplb2YoTm9kZSkpOwoJbm9kZS0+bGVmdCA9IE5VTEw7Cglub2RlLT5yaWdodCA9IE5VTEw7Cglub2RlLT52YWx1ZSA9IHZhbHVlOwoJcmV0dXJuIG5vZGU7Cn0KCnZvaWQgcmVsZWFzZU5vZGUoTFBOb2RlIG5vZGUpIHsKCWlmIChub2RlID09IE5VTEwpIHsKCQlyZXR1cm47Cgl9CglpZiAobm9kZS0+bGVmdCAhPSBOVUxMKSB7CgkJcmVsZWFzZU5vZGUobm9kZS0+bGVmdCk7CgkJbm9kZS0+bGVmdCA9IE5VTEw7Cgl9CglpZiAobm9kZS0+cmlnaHQgIT0gTlVMTCkgewoJCXJlbGVhc2VOb2RlKG5vZGUtPnJpZ2h0KTsKCQlub2RlLT5yaWdodCA9IE5VTEw7Cgl9CglmcmVlKG5vZGUpOwp9CgppbnQgbm9kZURlcHRoKExQTm9kZSBub2RlKSB7CglpZiAobm9kZSAhPSBOVUxMKSB7CgkJcmV0dXJuIGlNYXgobm9kZURlcHRoKG5vZGUtPmxlZnQpLCBub2RlRGVwdGgobm9kZS0+cmlnaHQpKSArIDE7Cgl9IGVsc2UgewoJCXJldHVybiAwOwoJfQp9CgpMUE5vZGUgcm90YXRlUihMUE5vZGUgbm9kZSkgewoJTFBOb2RlIHRlbXAxLCB0ZW1wMjsKCWlmIChub2RlID09IE5VTEwgfHwgbm9kZS0+cmlnaHQgPT0gTlVMTCkgewoJCXJldHVybiBub2RlOwoJfQoJdGVtcDEgPSBub2RlLT5yaWdodDsKCWlmIChub2RlRGVwdGgodGVtcDEtPmxlZnQpID4gbm9kZURlcHRoKHRlbXAxLT5yaWdodCkpIHsKCQl0ZW1wMiA9IHRlbXAxLT5sZWZ0OwoJCW5vZGUtPnJpZ2h0ID0gdGVtcDItPmxlZnQ7CgkJdGVtcDEtPmxlZnQgPSB0ZW1wMi0+cmlnaHQ7CgkJdGVtcDItPmxlZnQgPSBub2RlOwoJCXRlbXAyLT5yaWdodCA9IHRlbXAxOwoJCXJldHVybiB0ZW1wMjsKCX0gZWxzZSB7CgkJbm9kZS0+cmlnaHQgPSB0ZW1wMS0+bGVmdDsKCQl0ZW1wMS0+bGVmdCA9IG5vZGU7CgkJcmV0dXJuIHRlbXAxOwoJfQp9CgpMUE5vZGUgcm90YXRlTChMUE5vZGUgbm9kZSkgewoJTFBOb2RlIHRlbXAxLCB0ZW1wMjsKCWlmIChub2RlID09IE5VTEwgfHwgbm9kZS0+bGVmdCA9PSBOVUxMKSB7CgkJcmV0dXJuIG5vZGU7Cgl9Cgl0ZW1wMSA9IG5vZGUtPmxlZnQ7CglpZiAobm9kZURlcHRoKHRlbXAxLT5sZWZ0KSA+IG5vZGVEZXB0aCh0ZW1wMS0+cmlnaHQpKSB7CgkJbm9kZS0+bGVmdCA9IHRlbXAxLT5yaWdodDsKCQl0ZW1wMS0+cmlnaHQgPSBub2RlOwoJCXJldHVybiB0ZW1wMTsKCX0gZWxzZSB7CgkJdGVtcDIgPSB0ZW1wMS0+cmlnaHQ7CgkJdGVtcDEtPnJpZ2h0ID0gdGVtcDItPmxlZnQ7CgkJbm9kZS0+bGVmdCA9IHRlbXAyLT5yaWdodDsKCQl0ZW1wMi0+bGVmdCA9IHRlbXAxOwoJCXRlbXAyLT5yaWdodCA9IG5vZGU7CgkJcmV0dXJuIHRlbXAyOwoJfQp9CgpMUE5vZGUgYWRkTm9kZShMUE5vZGUgcm9vdCwgTFBOb2RlIG5vZGUpIHsKCUxQTm9kZSB0ZW1wOwoJaW50IGRpZmYsIGRsLCBkcjsKCWlmIChyb290ID09IE5VTEwpIHsKCQlyZXR1cm4gbm9kZTsKCX0KCWlmIChub2RlID09IE5VTEwpIHsKCQlyZXR1cm4gcm9vdDsKCX0KCWlmIChub2RlLT52YWx1ZSA8PSByb290LT52YWx1ZSkgewoJCXJvb3QtPmxlZnQgPSBhZGROb2RlKHJvb3QtPmxlZnQsIG5vZGUpOwoJfSBlbHNlIHsKCQlyb290LT5yaWdodCA9IGFkZE5vZGUocm9vdC0+cmlnaHQsIG5vZGUpOwoJfQoJZGwgPSBub2RlRGVwdGgocm9vdC0+bGVmdCk7CglkciA9IG5vZGVEZXB0aChyb290LT5yaWdodCk7CglkaWZmID0gZGwgLSBkcjsKCWlmIChkaWZmIDwgLTEpIHsKCQlyb290ID0gcm90YXRlUihyb290KTsKCX0gZWxzZSBpZiAoZGlmZiA+IDEpIHsKCQlyb290ID0gcm90YXRlTChyb290KTsKCX0KCXJldHVybiByb290Owp9CgoKCg==
----------------------------------
5
----------------------------------
5
-- 6
----------------------------------
6
5 9
----------------------------------
6
5 9
-- -- -- 13
----------------------------------
6
5 11
-- -- 9 13
----------------------------------
11
6 13
5 9 -- 19
----------------------------------
11
6 13
5 9 -- 19
-- -- 7 -- -- -- -- --
----------------------------------
11
6 13
5 9 -- 19
-- -- 7 10 -- -- -- --
----------------------------------
11
7 13
6 9 -- 19
5 -- 8 10 -- -- -- --
----------------------------------
11
7 14
6 9 13 19
5 -- 8 10 -- -- -- --
----------------------------------
11
7 14
5 9 13 19
4 6 8 10 -- -- -- --
----------------------------------
7
5 11
4 6 9 14
3 -- -- -- 8 10 13 19
----------------------------------
7
5 11
4 6 9 14
3 -- -- -- 8 10 13 19
-- -- -- -- -- -- -- -- -- -- -- -- -- -- 16 --
----------------------------------
7
5 11
4 6 9 14
3 -- -- -- 8 10 13 16
-- -- -- -- -- -- -- -- -- -- -- -- -- -- 15 19
----------------------------------
7
5 11
3 6 9 14
2 4 -- -- 8 10 13 16
-- -- -- -- -- -- -- -- -- -- -- -- -- -- 15 19
----------------------------------
7
5 11
3 6 9 14
2 4 -- -- 8 10 13 16
-- -- -- -- -- -- -- -- -- -- -- -- 12 -- 15 19
----------------------------------
depth=5, value=7, left=3, right=4
L[5][7]
depth=3, value=5, left=2, right=1
L[3][5]
depth=2, value=3, left=1, right=1
L[2][3]
depth=1, value=2, left=0, right=0
L[1][2]
R[1][2]
R[2][3]
depth=1, value=4, left=0, right=0
L[1][4]
R[1][4]
R[3][5]
depth=1, value=6, left=0, right=0
L[1][6]
R[1][6]
R[5][7]
depth=4, value=11, left=2, right=3
L[4][11]
depth=2, value=9, left=1, right=1
L[2][9]
depth=1, value=8, left=0, right=0
L[1][8]
R[1][8]
R[2][9]
depth=1, value=10, left=0, right=0
L[1][10]
R[1][10]
R[4][11]
depth=3, value=14, left=2, right=2
L[3][14]
depth=2, value=13, left=1, right=0
L[2][13]
depth=1, value=12, left=0, right=0
L[1][12]
R[1][12]
R[2][13]
R[3][14]
depth=2, value=16, left=1, right=1
L[2][16]
depth=1, value=15, left=0, right=0
L[1][15]
R[1][15]
R[2][16]
depth=1, value=19, left=0, right=0
L[1][19]
R[1][19]