您的位置:首页 > 其它

(1)把二元查找树转变成排序的双向链表

2012-05-07 18:34 369 查看

题目:

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。
   如:        10 
                  /      \
              6          14
            /    \         /    \
        4        8   12    16
转换成双向链表 4=6=8=10=12=14=16。

分析:

中序遍历二叉排序树可以得到排好序的序列;
只需在中序遍历过程中,调整每个节点的指针;
注意双向链表头结点的位置。

#include"stdio.h"
#include"stdlib.h"

typedef struct Node{
int data;
struct Node *Lchild;
struct Node *Rchild;
} Node,*Tree;

Node *prenode=NULL,*curnode=NULL,*root=NULL;//前一结点,当前结点,排序后头结点

Tree CreatBSTree(Tree T,int *data,int n){  //data为建立树的数据数组,n为数据个数
int i;
Tree pre = NULL, s = NULL;
for(i = 0;i < n;i++){
if(T == NULL){					//如果树为空,那么为根节点分配空间
T = (Tree)malloc(sizeof(Node));
T->data = data[i];
T->Lchild = T->Rchild = NULL;
}
else{
s = T;
while(s != NULL){			//搜索s改插入的位置
pre = s;
if(data[i] < s->data) s = s->Lchild;
else s = s->Rchild;
}
s = (Tree)malloc(sizeof(Node));//建立节点,插入到适当位置
s->data = data[i];
s->Lchild = s->Rchild = NULL;
if(s->data < pre->data) pre->Lchild = s;
else pre->Rchild = s;
}
}
return T;
}

void Trans(Tree T){
if(T != NULL){
Trans(T->Lchild);
curnode = T;
if(prenode == NULL){  //如果prenode为空,则该节点为中序遍历的第一个节点
root = curnode;
}
else
prenode->Rchild = curnode;
curnode->Lchild = prenode;
prenode = curnode;
Trans(T->Rchild);
}
}

void PrintList(Tree T){
Tree p = T;
while(p != NULL){
printf("%d",p->data);
p = p->Rchild;
}
}

int main(){
int a[10] = {
6,4,2,8,1,9,0,3,5,7
};
Tree T = NULL;
T = CreatBSTree(T,a,10);
Trans(T);
PrintList(root);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tree null struct