二元查找树最大的特点就是左孩子节点小于父亲节点,右孩子节点大于父亲节点,所以在中序遍历的时候,进行一下指针的改变即可。
具体的步骤就是先根据输入建立树,然后在中序遍历的时候,确定head和tail,head的确定可以是最左子树,也就是中序遍历第一个输出的元素。
然后tail的确定可以采取迭代赋值的方式,最后一个输出的元素就是tail;
原题如下 1.把二元查找树转变成排序的双向链表
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
我的代码,如果有不对,请指正
#include <stdio.h>
#include <malloc.h>
typedef struct searchTree
{
int data;
struct searchTree *lchild;
struct searchTree *rchild;
}*Tree;
Tree temp=NULL;
Tree head=NULL;
Tree tail;
int midtravelToList(Tree tree)
{
//printf("tree=%d ",tree);
if(tree!=NULL)
{
midtravelToList((tree)->lchild);
printf("%d ",(tree)->data);
if(temp==NULL)
{
temp=tree;
head=tree;
}
else
{
temp->rchild=tree;
(tree)->lchild=temp;
temp=tree;
tail=tree;
}
midtravelToList((tree)->rchild);
}
}
Tree createTree(int array[],int length)
{
Tree nodes[100];
int i=0;
int j;
for(i=0;i<length;i++)
{
if(array[i]!=-1)
{
nodes[i]=(Tree *)malloc(sizeof(struct searchTree));
nodes[i]->data=array[i];
nodes[i]->lchild=NULL;
nodes[i]->rchild=NULL;
j=(i-1)/2;
if(i%2==1&&i>0)
{
nodes[j]->lchild=nodes[i];
}
else if(i>0)
{
nodes[j]->rchild=nodes[i];
}
}
else
{
nodes[i]=NULL;
}
}
return nodes[0];
}
int travelList(Tree tree)
{
Tree t=tree;
while(t!=NULL)
{
printf("%d ",t->data);
t=t->rchild;
}
}
int reverseTravelList(Tree tree)
{
Tree t=tree;
while(t!=NULL)
{
printf("%d ",t->data);
t=t->lchild;
}
}
int main()
{
Tree searchTree;
int array[100];
int i=0;
printf("input ,-1 represents null.,ends with '#'\n");
while(scanf("%d",&array[i])==1)
{
i++;
}
searchTree=createTree(array,i);
midtravelToList(searchTree);
printf("\n");
travelList(head);
printf("\n");
reverseTravelList(tail);
}