/******************************
二叉搜索树相关算法集合
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!");
}