(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); }
相关文章推荐
- 每日一道算法题1 ——把二元查找树转变成排序的双向链表
- [原]【1】二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 1.把二元查找树转变成排序的双向链表
- 二元查找树转变成排序的双向链表
- 数据结构面试题1.2.1-把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表…
- 程序员面试题精选(01)-把二元查找树转变成排序的双向链表
- 算法-1.把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表——Java实现
- 把二元查找树转变成排序的双向链表[数据结构]
- 练习系列 - 1、把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 中序线索二叉树算法 解决 把二元查找树转变成排序的双向链表
- 微软面试(1/100)---把二元查找树转变成排序的双向链表
- 天天算法03——二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表