题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
首先我们定义的二元查找树 节点的数据结构如下:
struct BSTreeNode
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
首先我们定义的二元查找树 节点的数据结构如下:
struct BSTreeNode
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
};
分析:
该题要考虑两点:
1、怎样是二叉搜索树有序呢? 答:中序遍历得到的是有序序列
2、怎样使结点间相联系呢? 答:二叉树的线索化
下面给出代码(结点定义和题目不太一样):
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define RanNum 50 //随机数范围
#define Size 10 //结点个数
typedef struct node
{
int value;
struct node *lChild,*rChild;
}BSTNode;
BSTNode *pre=NULL,*cur=NULL,*root=NULL;//前一结点,当前结点,排序后头结点
void Trans(BSTNode *p); //二叉搜索树转换为有序双链表
void Output(BSTNode *p); //有序输出双链表
BSTNode* CreateTree(BSTNode *p);//创建二叉搜索树
int main()
{
BSTNode *p=NULL;
p=CreateTree(p);
Trans(p);
printf("After transformation,the sequence is : \n");
Output(root);
printf("\n");
system("pause");
return 0;
}
BSTNode* CreateTree(BSTNode *p)
{
int num,i;
BSTNode *s=NULL,*front=NULL;//s为新结点,front为新结点前一结点
srand((unsigned)time(NULL));
for (i=0;i<Size;i++) //产生10个随机数构成二叉搜索树
{
num=rand()%RanNum+1;
if (p==NULL) //如果树不存在,构建它
{
p=(BSTNode*)malloc(sizeof(BSTNode));
p->value=num;
p->lChild=p->rChild=NULL;
}
else
{
s=p; //否则,依据规则创建它
while (s!=NULL)
{
front=s;
if (num<=s->value)
{
s=s->lChild;
}
else
{
s=s->rChild;
}
}
s=(BSTNode*)malloc(sizeof(BSTNode));
s->value=num;
s->lChild=s->rChild=NULL;
if (num<=front->value)
{
front->lChild=s;
}
else
{
front->rChild=s;
}
}
}
return p;
}
void Trans(BSTNode *p) //核心程序
{
if (p)
{
Trans(p->lChild);
cur=p;
if (pre==NULL) //如果没有前一结点,将当前结点设为头结点
{
root=cur;
}
else
{
pre->rChild=cur;
}
cur->lChild=pre;
pre=cur;
Trans(p->rChild);
}
}
void Output(BSTNode *p)
{
while (p!=NULL)
{
printf("%d ",p->value);
p=p->rChild;
}
}