题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。
如: 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); }