1.把二元查找树转变成排序的双向链表

本文介绍如何将一棵二叉查找树转换为排序的双向链表,通过中序遍历实现节点间的链接,无需新建节点。文章提供C语言实现代码,并展示了从随机生成的二叉树到链表的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值