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