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

前端 未结 11 1197
借酒劲吻你
借酒劲吻你 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:45

    #include 
    #include 
    
    typedef int data_t;
    
    struct tree_node {
        struct tree_node * left;
        struct tree_node * right;
        data_t data;
    };
    
            /* a bonsai-tree for testing */
    struct tree_node nodes[10] =
    {{ nodes+1, nodes+2, 1}
    ,{ nodes+3, nodes+4, 2}
    ,{ nodes+5, nodes+6, 3}
    ,{ nodes+7, nodes+8, 4}
    ,{ nodes+9, NULL, 5}
    ,{ NULL, NULL, 6}
    ,{ NULL, NULL, 7}
    ,{ NULL, NULL, 8}
    ,{ NULL, NULL, 9}
            };
    
    struct tree_node * harvest(struct tree_node **hnd)
    {
    struct tree_node *ret;
    
    while (ret = *hnd) {
            if (!ret->left && !ret->right) {
                    *hnd = NULL;
                    return ret;
                    }
            if (!ret->left ) {
                    *hnd = ret->right;
                    ret->right = NULL;;
                    return ret;
                    }
            if (!ret->right) {
                    *hnd = ret->left;
                    ret->left = NULL;;
                    return ret;
                    }
            hnd = (rand() &1) ? &ret->left : &ret->right;
            }
    
    return NULL;
    }
    
    void insert(struct tree_node **hnd, struct tree_node *this)
    {
    struct tree_node *ret;
    
    while ((ret= *hnd)) {
            hnd = (this->data  < ret->data ) ? &ret->left : &ret->right;
            }
    *hnd = this;
    }
    
    void show(struct tree_node *ptr, int indent)
    {
    if (!ptr) { printf("Null\n"); return; }
    
    printf("Node(%d):\n", ptr->data);
    printf("%*c=", indent, 'L');  show (ptr->left, indent+2);
    printf("%*c=", indent, 'R');  show (ptr->right, indent+2);
    }
    
    int main(void)
    {
    struct tree_node *root, *this, *new=NULL;
    
    for (root = &nodes[0]; this = harvest (&root);  ) {
            insert (&new, this);
            }
    
    show (new, 0);
    return 0;
    }
    

提交回复
热议问题