参看http://blog.csdn.net/v_JULY_v/article/details/6057286
算是学习笔记
1把二元查找树转变成排序的双向链表(树)
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ /
6 14
/ / / /
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
#include<iostream>
using namespace std;
typedef struct Node
{
struct Node *lchild;
struct Node *rchild;
int data;
}Node,*pNode,*pTree;
pNode createNode(int data)
{
pNode ret = (pNode)malloc(sizeof(Node));
ret->lchild=NULL;
ret->rchild=NULL;
ret->data=data;
return ret;
}
void print(pTree p)
{
if(p==NULL)
return;
print(p->lchild);
cout<<p->data<<"left :";
if(p->lchild!=NULL)
cout<<p->lchild->data<<" ";
cout<<"right: ";
if(p->rchild!=NULL)
cout<<p->rchild->data<<" ";
cout<<endl;
print(p->rchild);
}
void ChangeToList(pTree p)
{
if(p==NULL)
return ;
pTree child=p->lchild;
if(child != NULL)
{
ChangeToList(child);
while(child->rchild!=NULL)
child=child->rchild;
child->rchild=p;
p->lchild=child;
}
child =p->rchild;
if(child!=NULL)
{
ChangeToList(child);
while(child->lchild!=NULL)
child=child->lchild;
child->lchild=p;
p->rchild=child;
}
}
int main(void)
{
pTree tree= createNode(10);
pNode tem=createNode(6);
tree->lchild=tem;
tem->lchild=createNode(4);
tem->rchild=createNode(8);
tem= createNode(14);
tree->rchild=tem;
tem->lchild=createNode(12);
tem->rchild=createNode(16);
print(tree);
ChangeToList(tree);
while(tree->lchild!=NULL)
tree=tree->lchild;
while(tree->rchild!=NULL)
{
cout<<" "<<tree->data;
cout<<" lchlid : ";
if(tree->lchild !=NULL)
cout<<tree->lchild->data;
cout<<" rchild : ";
if(tree->rchild!=NULL)
cout<< tree->rchild->data;
cout<<endl;
tree=tree->rchild;
}
}