#include <iostream>
#include <array>
using namespace std;
struct Node {
int data;
Node *left;
Node *right;
Node(int val) {
this->data = val;
this->left = NULL;
this->right = NULL;
}
};
/* creates binary search tree with minimal height from sorted array */
Node *makeBSTfromArray(int *a, int min, int max) {
if (min > max)
return NULL;
int mid = (min + max) / 2;
Node *root = new Node(a[mid]);
root->left = makeBSTfromArray(a, min, mid-1);
root->right = makeBSTfromArray(a, mid+1, max);
return root;
}
/* compute the "height" of a tree -- distance from root node to farthest leaf */
int height(Node *node)
{
if (node == NULL) return 0;
int lheight = height(node->left);
int rheight = height(node->right);
return (lheight > rheight) ? lheight+1 : rheight+1;
}
/* util function -- prints all nodes at given level of tree */
void printTreeAtLevel(Node *node, int level) {
if (node == NULL) return;
if (level == 1)
printf("%d ", node->data);
else {
printTreeAtLevel(node->left, level-1);
printTreeAtLevel(node->right, level-1);
}
}
/* print out level order traversal of tree */
void printTreeLevelOrder(Node *node) {
int h = height(node);
for (int i = 1; i < h; i++) {;
printf("%d: ", i);
printTreeAtLevel(node, i);
printf("\n");
}
}
int main() {
int input[] = {3,4,5,6,7,8,9,10,12,13};
//output = {7,4,3,5,6,10,8,9,12,13}
Node *root = makeBSTfromArray(input, 0, 10-1);
printTreeLevelOrder(root);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXJyYXk+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgTm9kZSB7CglpbnQgZGF0YTsKCU5vZGUgKmxlZnQ7CglOb2RlICpyaWdodDsKCQoJTm9kZShpbnQgdmFsKSB7CgkJdGhpcy0+ZGF0YSA9IHZhbDsKCQl0aGlzLT5sZWZ0ICA9IE5VTEw7CgkJdGhpcy0+cmlnaHQgPSBOVUxMOwoJfQp9OwoKLyogY3JlYXRlcyBiaW5hcnkgc2VhcmNoIHRyZWUgd2l0aCBtaW5pbWFsIGhlaWdodCBmcm9tIHNvcnRlZCBhcnJheSAqLwpOb2RlICptYWtlQlNUZnJvbUFycmF5KGludCAqYSwgaW50IG1pbiwgaW50IG1heCkgewoJaWYgKG1pbiA+IG1heCkgCgkgICAgcmV0dXJuIE5VTEw7CgkgICAgCglpbnQgbWlkID0gKG1pbiArIG1heCkgLyAyOwoJTm9kZSAqcm9vdCA9IG5ldyBOb2RlKGFbbWlkXSk7Cglyb290LT5sZWZ0ICA9IG1ha2VCU1Rmcm9tQXJyYXkoYSwgbWluLCBtaWQtMSk7Cglyb290LT5yaWdodCA9IG1ha2VCU1Rmcm9tQXJyYXkoYSwgbWlkKzEsIG1heCk7CgkKCXJldHVybiByb290Owp9CgovKiBjb21wdXRlIHRoZSAiaGVpZ2h0IiBvZiBhIHRyZWUgLS0gZGlzdGFuY2UgZnJvbSByb290IG5vZGUgdG8gZmFydGhlc3QgbGVhZiAqLwppbnQgaGVpZ2h0KE5vZGUgKm5vZGUpCnsKICAgIGlmIChub2RlID09IE5VTEwpIHJldHVybiAwOwogICAgICAgIAogICAgaW50IGxoZWlnaHQgPSBoZWlnaHQobm9kZS0+bGVmdCk7CiAgICBpbnQgcmhlaWdodCA9IGhlaWdodChub2RlLT5yaWdodCk7CiAgICAKICAgIHJldHVybiAobGhlaWdodCA+IHJoZWlnaHQpID8gbGhlaWdodCsxIDogcmhlaWdodCsxOwp9CgovKiB1dGlsIGZ1bmN0aW9uIC0tIHByaW50cyBhbGwgbm9kZXMgYXQgZ2l2ZW4gbGV2ZWwgb2YgdHJlZSAqLwp2b2lkIHByaW50VHJlZUF0TGV2ZWwoTm9kZSAqbm9kZSwgaW50IGxldmVsKSB7CglpZiAobm9kZSA9PSBOVUxMKSByZXR1cm47CgkKCWlmIChsZXZlbCA9PSAxKQoJICAgIHByaW50ZigiJWQgIiwgbm9kZS0+ZGF0YSk7CgllbHNlIHsKCQlwcmludFRyZWVBdExldmVsKG5vZGUtPmxlZnQsIGxldmVsLTEpOwoJCXByaW50VHJlZUF0TGV2ZWwobm9kZS0+cmlnaHQsIGxldmVsLTEpOwoJfQp9CgovKiBwcmludCBvdXQgbGV2ZWwgb3JkZXIgdHJhdmVyc2FsIG9mIHRyZWUgKi8Kdm9pZCBwcmludFRyZWVMZXZlbE9yZGVyKE5vZGUgKm5vZGUpIHsKCWludCBoID0gaGVpZ2h0KG5vZGUpOwoJCglmb3IgKGludCBpID0gMTsgaSA8IGg7IGkrKykgezsKCQlwcmludGYoIiVkOiAiLCBpKTsKCQlwcmludFRyZWVBdExldmVsKG5vZGUsIGkpOwoJCXByaW50ZigiXG4iKTsKCX0KfQogICAgCgoKaW50IG1haW4oKSB7CgogICAgaW50IGlucHV0W10gPSB7Myw0LDUsNiw3LDgsOSwxMCwxMiwxM307CiAgICAgIC8vb3V0cHV0ID0gezcsNCwzLDUsNiwxMCw4LDksMTIsMTN9CiAgICAKICAgIE5vZGUgKnJvb3QgPSBtYWtlQlNUZnJvbUFycmF5KGlucHV0LCAwLCAxMC0xKTsKICAgIHByaW50VHJlZUxldmVsT3JkZXIocm9vdCk7CiAgICAKCXJldHVybiAwOwp9