您的位置:首页 > 理论基础 > 数据结构算法

【学习点滴-数据结构-二叉树】二叉查找树转换成双链表

2012-05-31 15:00 411 查看
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#defineLEAF-1

typedefstructBTreenode{
BTreenode*lchild;
BTreenode*rchild;
intvalue;

}BTreenode,*Btree;

BTreenode*createTree(){
BTreenode*T;
intt;
scanf("%d",&t);
if(t==LEAF){
T=NULL;
}else{
T=(BTreenode*)malloc(sizeof(BTreenode));
T->value=t;
T->lchild=createTree();
T->rchild=createTree();
}

returnT;
}

voiddoChange(BTreenode*root,BTreenode*&head,BTreenode*&tail){
BTreenode*left,*right;
if(root==NULL){
head=tail=NULL;
return;
}
doChange(root->lchild,head,left);
doChange(root->rchild,right,tail);
if(left!=NULL){
left->rchild=root;
root->lchild=left;
}else{
head=root;
}
if(right!=NULL){
root->rchild=right;
right->lchild=root;
}else{
tail=root;
}


}

BTreenode*TreeToLinkedList(BTreenode*root){
BTreenode*head=NULL,*tail=NULL;
doChange(root,head,tail);
returnhead;
}

voidpreOrder(BTreenode*root){
if(root!=NULL){
printf("%d",root->value);
}
if(root->lchild!=NULL){
preOrder(root->lchild);
}
if(root->rchild!=NULL){
preOrder(root->rchild);
}
}

voidtraverse(BTreenode*head){
printf("traverse:");
BTreenode*iter=head;
while(iter!=NULL){
printf("%d",iter->value);
iter=iter->rchild;
}
printf("\n");
}

voidreTraverse(BTreenode*root){
printf("reTraverse:");
BTreenode*iter=root;
while(iter!=NULL&&iter->rchild!=NULL){
iter=iter->rchild;
}
while(iter!=NULL){
printf("%d",iter->value);
iter=iter->lchild;
}
printf("\n");
}
main(){
BTreenode*root;
root=createTree();
preOrder(root);
printf("\n");
root=TreeToLinkedList(root);
traverse(root);
reTraverse(root);
system("pause");
return0;

}
//TODO转换方式2:中序遍历的过程中就直接处理好相应的指针~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: