linux写链表排序的模块,把二元查找树转变成排序的双向链表

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。

要求不能创建任何新的结点,只调整指针的指向。

10

/ /

6  14

/ / / /

4  8 12 16

转换成双向链表

4=6=8=10=12=14=16。

#define _CRT_SECURE_NO_WARNINGS

#include

#include

#include

#include

typedef struct BSTreeNode

{

int date;

struct BSTreeNode *leftnode;

struct BSTreeNode *rightnode;

}BSTree;

BSTree *head = NULL;

BSTree *tail = NULL;

void creatree(BSTree **node, int num)

{

BSTree *newnode;

newnode = (BSTree *)malloc(sizeof(BSTree));

newnode->date = num;

newnode->leftnode = NULL;

newnode->rightnode = NULL;

BSTree *p = NULL;

BSTree *y = NULL;

p = *node;

while (p)

{

y = p;

if (newnode->date > p->date)

{

p = p->rightnode;

}

else

{

p = p->leftnode;

}

}

if (y == NULL)

{

*node = newnode;

}

else

{

if (y->date > num)

{

y->leftnode = newnode;

}

else

{

y->rightnode = newnode;

}

}

}

void inorder(BSTree *node, void(*TreeLink)(BSTree *node))

{

if (node != NULL)

{

inorder((node->leftnode), TreeLink);

TreeLink(node);

inorder((node->rightnode), TreeLink);

}

}

void TreeLink(BSTree *node)

{

node->leftnode=tail;

if (tail==NULL)

{

head = node;

}

else

{

tail->rightnode = node;

}

tail = node;

printf("%d ", node->date);

}

void main()

{

int a[8] = { 10, 6, 14, 4, 8, 12, 16 };

BSTree *node=NULL;

for (int i = 0; i < 7; i++)

{

creatree(&node, a[i]);

}

inorder(node,TreeLink);

system("pause");

}

5d07dade9e7cc265ec51fa165fd0431d.png

0b1331709591d260c1c78e86d0c51c18.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值