Guest User

Untitled

a guest
Apr 8th, 2019
503
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.34 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. template<typename T>
  4. struct TreeNode {
  5.   TreeNode(T value) : parent(nullptr), left(nullptr), right(nullptr) {
  6.     this->value = value;
  7.   }
  8.   ~TreeNode() {
  9.     delete left;
  10.     delete right;
  11.   }
  12.   TreeNode<T>* parent;
  13.   TreeNode<T>* left;
  14.   TreeNode<T>* right;
  15.   T value;
  16. };
  17.  
  18. const int INVALID = -1;
  19.  
  20. inline int left_child_idx(int curr, int len) {
  21.   int child = curr * 2 + 1;
  22.   return child < len ? child : INVALID;
  23. }
  24.  
  25. inline int right_child_idx(int curr, int len) {
  26.   int child = curr * 2 + 2;
  27.   return child < len ? child : INVALID;
  28. }
  29.  
  30. inline int parent_idx(int curr, int len) {
  31.   return curr == 0 ? INVALID : (curr - 1) / 2;
  32. }
  33.  
  34. template<typename T>
  35. TreeNode<T>* construct_tree(T* arr, int len) {
  36.   if (len == 0) {
  37.     return nullptr;
  38.   }
  39.  
  40.   TreeNode<T>* root = new TreeNode<T>(arr[0]);
  41.   TreeNode<T>* curr = root;
  42.   int curr_idx = 0;
  43.   while (curr) {
  44.     if (curr->left == nullptr) {
  45.       // No left child.
  46.       assert(curr->right == nullptr);
  47.       int child_idx = left_child_idx(curr_idx, len);
  48.       if (child_idx != INVALID) {
  49.         TreeNode<T>* child_node = new TreeNode<T>(arr[child_idx]);
  50.         curr->left = child_node;
  51.         child_node->parent = curr;
  52.         curr = child_node;
  53.         curr_idx = child_idx;
  54.         continue;
  55.       }
  56.     } else if (curr->right == nullptr) {
  57.       // Has left child, but no right child.
  58.       int child_idx = right_child_idx(curr_idx, len);
  59.       if (child_idx != INVALID) {
  60.         TreeNode<T>* child_node = new TreeNode<T>(arr[child_idx]);
  61.         curr->right = child_node;
  62.         child_node->parent = curr;
  63.         curr = child_node;
  64.         curr_idx = child_idx;
  65.         continue;
  66.       }
  67.     }
  68.     curr_idx = parent_idx(curr_idx, len);
  69.     curr = curr->parent;
  70.   }
  71.   assert(curr_idx == INVALID);
  72.   return root;
  73. }
  74.  
  75. void debug_print(TreeNode<int>* node) {
  76.   if (node == nullptr) return;
  77.   printf("(");
  78.   debug_print(node->left);
  79.   printf("%d", node->value);
  80.   debug_print(node->right);
  81.   printf(")");
  82. }
  83.  
  84. void test(int count) {
  85.   int arr[count];
  86.   for (int i=0; i<count; ++i) {
  87.     arr[i] = i;
  88.   }
  89.   TreeNode<int>* root = construct_tree<int>(arr, count);
  90.   debug_print(root); printf("\n");
  91.   delete root;
  92. }
  93.  
  94. int main() {
  95.   int input[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  96.   for (int i = 0; i < 10; ++i) {
  97.     test(i);
  98.   }
  99. }
Advertisement
Add Comment
Please, Sign In to add comment