将二叉排序树转换为有序的双向链表,只需调整结点的指针位置。见代码
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef struct BSTNode
{
int data;
struct BSTNode *left, *right;
} BSTNode, *BSTree;
/*
*在二叉查找树中查找数据域为n个结点
*parent是当前结点的父结点,当T是根结点时,parent=NULL
*/
Status BSTSearch(BSTree T, int n, BSTree *parent)
{
if (T == NULL)
return FALSE;
if (n == T->data)
{
*parent = T;
return TRUE;
}
if (n < T->data)
{
*parent = T;
return BSTSearch(T->left, n, parent);
}
if (n > T->data)
{
*parent = T;
return BSTSearch(T->right, n, parent);
}
}
/*
*在二叉查找树中插入数据域为n的结点
*/
Status BSTInsert(BSTree *T, int n)
{
BSTree parent, s;
parent = NULL; //parent的初始值为NULL
if (BSTSearch(*T, n, &parent))
return FALSE;
s = (BSTree)malloc(sizeof(BSTNode));
s->data = n;
s->left = s->right = NULL;
if (parent == NULL)
*T = s;
else if (n < parent->data)
parent->left = s;
else
parent->right = s;
return TRUE;
}
/*
*中序遍历二叉查找树,结果是一个递增数列
*/
void MidTraverse(BSTree T)
{
if (T != NULL)
{
MidTraverse(T->left);
printf("%d ", T->data);
MidTraverse(T->right);
}
}
/*
*将二叉排序树转换为有序的双向链表,只需调整结点的指针位置
*head指向有序双向链表的第一个结点,tail指向最后一个结点
*/
void ToLinkedList(BSTree T, BSTree *head, BSTree *tail)
{
BSTree lt, rh;
if (T == NULL)
*head = *tail = NULL;
else
{
ToLinkedList(T->left, head, <);
ToLinkedList(T->right, &rh, tail);
if (lt)
{
lt->right = T;
T->left = lt;
}
else
*head = T;
if (rh)
{
T->right = rh;
rh->left = T;
}
else
*tail = T;
}
}
int main(void)
{
int i;
int a[7] = {10, 6, 14, 4, 8, 16, 12};
BSTree head, tail, p;
BSTree T = NULL;
for (i = 0; i < 7; i++)
BSTInsert(&T, a[i]);
MidTraverse(T);
printf("\n");
ToLinkedList(T, &head, &tail);
p = head;
while (p) //向后遍历有序双向链表,结果是一个递增序列
{
printf("%d ", p->data);
p = p->right;
}
printf("\n");
p = tail;
while (p) //向前遍历有序双向链表,结果是一个递减序列
{
printf("%d ", p->data);
p = p->left;
}
printf("\n");
return 0;
}