二叉查找树转换为有序双向链表

将二叉排序树转换为有序的双向链表,只需调整结点的指针位置。见代码

#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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值