How to convert a binary tree to binary search tree in-place, i.e., we cannot use any extra space

前端 未结 11 1101
借酒劲吻你
借酒劲吻你 2021-01-31 22:12

How to convert a binary tree to binary search tree in-place, i.e., we cannot use any extra space.

相关标签:
11条回答
  • 2021-01-31 22:21

    Do inorder traversal of the binary tree and store the result. sort the result in acending order form the binary search tree by taking middle element of the sorted list as root( this can done using binary search). so we get balanced binary search tree.

    0 讨论(0)
  • 2021-01-31 22:25

    Do the PostOrder Traversal and from that create a Binary search tree.

    struct Node * newroot = '\0';
    
    struct Node* PostOrder(Struct Node* root)
    {
          if(root != '\0')
          {
              PostOrder(root->left);
              PostOrder(root->right);
              insertBST(root, &newroot);
          }
    }
    
    insertBST(struct Node* node, struct Node** root)
    {
       struct Node * temp, *temp1;
       if( root == '\0')
       {
          *root == node;
           node->left ==  '\0';
           node->right == '\0';
       }
       else
       {
           temp = *root;
           while( temp != '\0')
           {
               temp1= temp;
               if( temp->data > node->data)
                   temp = temp->left;
               else
                   temp = temp->right;
           }
           if(temp1->data > node->data)
           {
               temp1->left = node;
           }
           else
           {
               temp1->right = node;
           }
           node->left = node->right = '\0';
        }
    }
    
    0 讨论(0)
  • 2021-01-31 22:26

    Convert Binary Tree to a doubly linked list- can be done inplace in O(n)
    Then sort it using merge sort, nlogn
    Convert the list back to a tree - O(n)

    Simple nlogn solution.

    0 讨论(0)
  • 2021-01-31 22:30

    A binary tree usually is a binary search tree, in which case no conversion is required.

    Perhaps you need to clarify the structure of what you are converting from. Is your source tree unbalanced? Is it not ordered by the key you want to search on? How did you arrive at the source tree?

    0 讨论(0)
  • 2021-01-31 22:36

    heap sort the tree.. nlogn complexity..

    0 讨论(0)
  • 2021-01-31 22:38
    struct Node
    {
        int value;
        Node* left;
        Node* right;
    };
    
    void swap(int& l, int& r)
    {
        int t = l;
        l = r;
        r = t;
    }
    
    void ConvertToBST(Node* n, Node** max)
    {
        if (!n) return;
    
        // leaf node
        if (!n->left && !n->right)
        {
            *max = n;
            return;
        }
    
        Node *lmax = NULL, *rmax = NULL;
        ConvertToBST(n->left, &lmax);
        ConvertToBST(n->right, &rmax);
    
        bool swapped = false;
        if (lmax && n->value < lmax->value)
        {
            swap(n->value, lmax->value);
            swapped = true;
        }
    
        if (rmax && n->value > rmax->value)
        {
            swap(n->value, n->right->value);
            swapped = true;
        }
    
        *max = n;
        if (rmax && rmax->value > n->value) *max = rmax;
    
        // If either the left subtree or the right subtree has changed, convert the tree to BST again
        if (swapped) ConvertToBST(n, max);
    }
    
    0 讨论(0)
提交回复
热议问题