把二元查找树转变成排序的双向链表
2014-12-23 13:42
543 查看
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
#include "stdlib.h" #include "stdio.h" typedef struct BSTNode { char data; struct BSTNode *lnode; struct BSTNode *rnode; }BSTNode; BSTNode *CreateTree(char pre[], char in[], int l1, int r1, int l2, int r2){ BSTNode *s; int i; if(l1 > r1) return NULL; s = (BSTNode *)malloc(sizeof(BSTNode)); s->lnode = s->rnode = NULL; for(i=l2; i<=r2; ++i){ if(pre[l1] == in[i]){ break; } } s->data = in[i]; s->lnode = CreateTree(pre, in, l1+1, l1+i-l2, l2, i-1); s->rnode = CreateTree(pre, in, l1+i-l2+1, r1, i+1, r2); return s; } void PrePrint(BSTNode *p){ if(p != NULL){ printf("%c ", p->data); PrePrint(p->lnode); PrePrint(p->rnode); } } void InPrint(BSTNode *p){ if(p != NULL){ InPrint(p->lnode); printf("%c ", p->data); InPrint(p->rnode); } } BSTNode *CreateDLNode(BSTNode *p, BSTNode *&prior){ if(p != NULL){ CreateDLNode(p->lnode, prior); if(prior != NULL) prior->rnode = p; p->lnode = prior; prior = p; CreateDLNode(p->rnode, prior); } return prior; } void main(){ char pre[] = {'A','B','C','D','E','F','G'}; char in[] = {'C','B','D','A','F','E','G'}; BSTNode *p; p = CreateTree(pre, in, 0, 6, 0, 6); //InPrint(p); BSTNode *ss = NULL; CreateDLNode(p, ss); while(ss){ printf("%c ", ss->data); ss = ss->lnode; } }
相关文章推荐
- 二元查找树转变成排序的双向链表
- (一)把二元查找树转变成排序的双向链表
- 第一题:把二元查找树转变成排序的双向链表
- 每天一算法(把二元查找树转变成排序的双向链表 )
- 【老鸟学算法】二元查找树转变成排序的双向链表——算法思想及java实现
- 把二元查找树转变成排序的双向链表
- 转载 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 天天算法03——二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- [何海涛][数据结构][把二元查找树转变成排序的双向链表]浅析
- 微软100题(1) 二元查找树转变成排序的双向链表
- 程序员面试题精选(1):把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 【1】二元查找树转变成排序的双向链表
- 程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表