Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.56 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. //#include <unistd.h>
  5. #include "bst.h"
  6.  
  7. typedef enum { false, true } bool;
  8.  
  9. Node* findMinimum(Node* root)
  10. {
  11.     if (root == NULL)
  12.         return NULL;
  13.     else if (root->left != NULL)
  14.         return findMinimum(root->left); // left most element will be minimum
  15.     return root;
  16. }
  17.  
  18. Node* createNode(int value) {
  19.     Node* n;
  20.     n = malloc(sizeof(struct Node)); // Allocate memory for new node
  21.     n->data = value;
  22.     n->left = NULL;
  23.     n->right = NULL;
  24.     return n;
  25. }
  26.  
  27. Node* insertNode(Node* root, int value) {
  28.     if (root == NULL) { // If tree is empty
  29.         return createNode(value);
  30.     }
  31.     else if (value < root->data) { // If we need to follow the left branch
  32.         root->left = insertNode(root->left, value);
  33.     }
  34.     else if (value > root->data) { // If we need to follow the right branch
  35.         root->right = insertNode(root->right, value);
  36.     }
  37.     return root;
  38. }
  39.  
  40. Node* deleteNode(Node* root, int value) {
  41.     if (root == NULL)
  42.         return NULL;
  43.  
  44.     if (value > root->data)
  45.         root->right = deleteNode(root->right, value);
  46.     else if (value < root->data)
  47.         root->left = deleteNode(root->left, value);
  48.     else {
  49.         // If we're deleting a leaf node
  50.         if (root->left == NULL && root->right == NULL)
  51.         {
  52.             free(root);
  53.             return NULL;
  54.         }
  55.         // If we're deleting a node with ONE child
  56.         else if (root->left == NULL || root->right == NULL) {
  57.             Node* temp;
  58.             if (root->left == NULL) { // The child node exists in the right branch
  59.                 temp = root->right;
  60.                 free(root);
  61.                 return temp;
  62.             }
  63.             else { // The child node exists in the left branch
  64.                 temp = root->left;
  65.                 free(root);
  66.                 return temp;
  67.             }
  68.         }
  69.         // If we're deleting a node with TWO children
  70.         else {
  71.             Node* temp = findMinimum(root->right);
  72.             root->data = temp->data;
  73.             root->right = deleteNode(root->right, temp->data);
  74.         }
  75.     }
  76.     return root;
  77. }
  78.  
  79. void printSubtree(Node* N) {
  80.     if (N != NULL) // Ensuring we dont try to print a nullptr
  81.     {
  82.         printSubtree(N->left); // Print all left child nodes
  83.         printf("%d\n", N->data); // Print the root
  84.         printSubtree(N->right);// Print all right child nodes
  85.     }
  86. }
  87.  
  88. int countNodes(Node* N) {
  89.     int nodes = 1;
  90.     if (N != NULL) {
  91.         nodes += countNodes(N->left);
  92.         nodes += countNodes(N->right);
  93.         return nodes;
  94.     }
  95.     else
  96.         return 0;
  97. }
  98.  
  99. Node* freeSubtree(Node* N) {
  100.     if (N != NULL) {
  101.         freeSubtree(N->left);
  102.         freeSubtree(N->right);
  103.         free(N);
  104.     }
  105.     return NULL;
  106. }
  107.  
  108.  
  109. int sumSubtree(Node *N)
  110. {
  111.     if (N != NULL)
  112.     {
  113.         return N->data + sumSubtree(N->left) + sumSubtree(N->right);
  114.     }
  115.     else
  116.         return 0;
  117.  
  118. }
  119.  
  120. void traverse_tree(Node* root, Node** ordered_nodes, size_t* index) {
  121.     if (root) {
  122.         traverse_tree(root->left, ordered_nodes, index);
  123.         ordered_nodes[(*index)++] = root;
  124.         traverse_tree(root->right, ordered_nodes, index);
  125.     }
  126. }
  127.  
  128. Node* rebuild_tree(Node** ordered_nodes, size_t left, size_t right) {
  129.     size_t mid;
  130.  
  131.     if (left <= right) {
  132.         mid = (left + right) / 2;
  133.         if (mid > 0) {
  134.             ordered_nodes[mid]->left = rebuild_tree(ordered_nodes, left, mid - 1);
  135.         }
  136.         ordered_nodes[mid]->right = rebuild_tree(ordered_nodes, mid + 1, right);
  137.         return ordered_nodes[mid];
  138.     }
  139.     else {
  140.         return NULL;
  141.     }
  142. }
  143.  
  144. // This functions converts an unbalanced BST to a balanced BST
  145. Node* balanceTree(Node* root)
  146. {
  147.     size_t   count = 0;
  148.     Node** ordered_nodes = NULL;
  149.     Node* result = NULL;
  150.  
  151.     count = countNodes(root);
  152.     ordered_nodes = (Node**)malloc(sizeof(Node*) * count);
  153.     count = 0;
  154.     traverse_tree(root, ordered_nodes, &count);
  155.     result = rebuild_tree(ordered_nodes, 0, count - 1);
  156.     free(ordered_nodes);
  157.     return result;
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement