题目描述,就是将二叉搜索树转成双向链表。
解析:这道题是将二叉搜索树转成双向链表。二叉树结点中有left指针和right指针,在双向链表中left指针指向上一个结点,而right指针指向下一个结点就行了。二叉搜索树转换成双向链表的过程是左子树指向父结点,父结点指向右子树,递归的解决左半部分,然后递归的解决右半部分,是典型分治思想分而治之的题目。
#include <stdio.h>
#include <stdlib.h>
typedef struct d{
int data;
struct d *left;
struct d *right;
}tree;
tree *createTree(int *a,int &n)
{
int num=a[n++];
if(num==NULL)
{
return NULL;
}
tree *s=(tree *)malloc(sizeof(tree));
s->data=num;
s->left=createTree(a,n);
s->right=createTree(a,n);
return s;
}
void Lat(tree *t)
{
if(t!=NULL)
{
Lat(t->left);
Lat(t->right);
printf("%d->",t->data);
}else
{
return;
}
}
void convertNode(tree *pNode,tree *&p)
{
if(pNode==NULL)
{
return;
}else
{
tree *pCurrent=pNode;
if(pCurrent->left!=NULL)
{
convertNode(pCurrent->left,p);
}
pCurrent->left=p;
if(p!=NULL)
{
p->right=pCurrent;
}
p=pCurrent;
if(pCurrent->right!=NULL)
{
convertNode(pCurrent->right,p);
}
}
}
tree *convert2Link(tree *t)
{
tree *p=NULL;
convertNode(t,p);
tree *listHead=p;
while(listHead!=NULL&&listHead->left!=NULL)
{
listHead=listHead->left;
}
return listHead;
}
void print(tree *t)
{
printf("I am here!\n");
for(;t!=NULL;t=t->right)
{
printf("%d->",t->data);
}
}
int main()
{
int a[]={10,6,4,0,0,8,0,0,14,12,0,0,16,0,0};
int n=0;
tree *t=createTree(a,n);
Lat(t);
tree *ret=convert2Link(t);
print(ret);
}