您的位置:首页 > 其它

算法练习1(二元查找树转换成双向链表)

2013-11-18 21:07 225 查看
1.把二元查找树转变成排序的双向链表

题目:

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

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

10

/ \

6 14

/ \ / \

4 8 12 16

转换成双向链表

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

#include<stdio.h>

#include<stdlib.h>

struct BSTreeNode

{

int value;

struct BSTreeNode* nleft;

struct BSTreeNode* nright;

}BSTNode;

void addBSTreeNode(BSTreeNode* &btn,int ch)

{

if(btn==NULL)

{

BSTreeNode *bn=(BSTreeNode*)malloc(sizeof(BSTNode));

bn->value=ch;

bn->nleft=NULL;

bn->nright=NULL;

btn=bn;

}else

{

if((btn->value) > ch)

addBSTreeNode(btn->nleft,ch);

else if(btn->value < ch)

addBSTreeNode(btn->nright,ch);

}

}

void InOrder(BSTreeNode *btn)

{

if(btn)

{

InOrder(btn->nleft);

printf("node: %d\n",btn->value);

InOrder(btn->nright);

}

}

void change(BSTreeNode *p,BSTreeNode* &last)

{

if(!p) return;

change(p->nleft,last);

if(last)

last->nright=p;

p->nleft=last;

last=p;

change(p->nright,last);

}

void PrintList(BSTreeNode *p)

{

while(p!=NULL)

{

printf("List node: %d\n",p->value);

p=p->nleft;

}

}

void main()

{

BSTreeNode *nroot,*tail;

nroot=NULL;

tail=NULL;

addBSTreeNode(nroot,10);

addBSTreeNode(nroot,4);

addBSTreeNode(nroot,6);

addBSTreeNode(nroot,8);

addBSTreeNode(nroot,12);

addBSTreeNode(nroot,14);

addBSTreeNode(nroot,16);

InOrder(nroot);

change(nroot,tail);

//printf("%d\n",tail->nleft->value);

PrintList(tail);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: