二叉搜索树与双向链表的转换

/******************************
二叉搜索树相关算法集合

1:二叉树转双向链表
******************************/

#include<stdio.h>
#include<stdlib.h>

#define valueType int

typedef struct Node {
    valueType value;
    struct Node *left;
    struct Node *right;
}BNode;

//建树
BNode *buildTree(valueType *a,int length) {
    if(a==NULL || length<=0 )
        return NULL;
    BNode *head=NULL,*p,*q;
    for(int i=0;i<length;i++) {
        p = (BNode *)malloc(sizeof(BNode));
        p->value=a[i];
        p->left=p->right=NULL;
        if(head==NULL) {
            head=p;
            head->left=NULL;
            head->right=NULL;
        }
        else {
            q = head;
            while(q!=NULL) {
                if(q->value > p->value) {
                    if(q->left==NULL) {
                        q->left=p;
                        break;
                    }
                    q=q->left;
                }
                else {
                    if(q->right==NULL) {
                        q->right=p;
                        break;
                    }
                    q=q->right;
                }
            }

        }
    }
    return head;
}

//中序遍历
void displayBTree(BNode * p) {
    if(p != NULL) {
        displayBTree(p->left);
        printf("%d ",p->value);
        displayBTree(p->right);
    }
    return;
}

//转成有序双向链表,不能新建空间
void bTreeToDList(BNode * p,BNode **pLastVisitNode) {
    if(p==NULL) 
        return;
    BNode * pCurrent = p;
    if(p->left!=NULL)
        bTreeToDList(p->left,pLastVisitNode);
    pCurrent->left = *pLastVisitNode;
    if(*pLastVisitNode!=NULL)
        (*pLastVisitNode)->right=pCurrent;
    *pLastVisitNode=pCurrent;
    if(pCurrent->right!=NULL)
        bTreeToDList(pCurrent->right,pLastVisitNode);
}


void main() {
    valueType a[10]={5,4,6,2,3,7,8,9,10,1};
    BNode * tree = buildTree(a,10);
    displayBTree(tree);
    printf("end!");
}

 

posted @ 2014-06-25 22:47  枫睿  阅读(185)  评论(0)    收藏  举报