lc109-有序链表转平衡二叉树

//有序链表建平衡二叉树,每次取得结点可选二分法求得的中间结点,左孩子为左半部分中间结点,右孩子为右半部分中间结点,以此类推。
bitree *sortedListToBST(linklist *head,linklist *tail){//有序链表转平衡二叉树(直接转)快慢指针方法(求的链表中间结点很好用的方法)
    if(head==tail){
        return NULL;
    }
    
    bitree *T;
    T=(bitree*)malloc(sizeof(bitree));
    linklist *slow=head,*fast=head;
    while(fast!=tail&&fast->next!=tail){
        slow=slow->next;
        fast=fast->next->next;
    }
    T->data=slow->data;
    //printf("%d",T->data);
    T->lchild=sortedListToBST(head,slow);
    T->rchild=sortedListToBST(slow->next,tail);
    return T;
}
bitree *sortedListToBST2(int num[],int l,int r){//数组进行建立平衡二叉树
    if(l>r){
        return NULL;
    }
    bitree *T=(bitree*)malloc(sizeof(bitree));
    int mid=(l+r)/2;
    T->data=num[mid];
    T->lchild=sortedListToBST2(num,l,mid-1);
    T->rchild=sortedListToBST2(num,mid+1,r);
    return T;
}
void trans(linklist *head){//链表转化为数组
    int i=0;
    temp=0;
    while(head->next!=NULL){
        num[i++]=head->next->data;
        head=head->next;
        temp++;
    }

}
void pre(bitree *T){
    if(T){
        printf("%d",T->data);
        pre(T->lchild);
        pre(T->rchild);
    }
}
void main(){
    linklist *head=create(5);
    //swapPairs(head);
    //reverseKGroup(head,3);
    //rotateRight(head,3);
    //head=deleteDuplicates2(head);
    //partition(head,3);
    //reverseBetween(head,1 ,4);
    //bitree *T=sortedListToBST(head->next,NULL);
    //pri(head);
    trans(head);
    bitree *T=sortedListToBST2(num,0,temp-1);
    pre(T);
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容