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

来源:互联网 发布:卖家如何开通淘宝客 编辑:程序博客网 时间:2024/05/18 20:33
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);
}