二叉查找树转换成排序的双向链表
题目要求是转换,所以不难想到二叉查找树的数据结构和双向链表是一样的,根据二叉查找树的性质,其中序遍历的数据就是由小到大排序,所以只需在其非递归的中序遍历代码中加入一些代码即可实现转换。
详细代码见project/树文件夹中代码,其中包含了三种基本遍历和层序遍历的非递归实现,都需要使用到栈。
三种基本遍历:
http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html
下面贴出基本功能代码:
typedef int ElementType;
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;
typedef struct TreeNode *DoubleList;//Left相当于指向前一个节点的指针 Right相当于指向后一个节点的指针
struct TreeNode{
ElementType Element;
SearchTree Left;
SearchTree Right;
};
typedef struct stack{
int count;
SearchTree Elment[MAX];
}*Stack;
SearchTree Insert( ElementType X, SearchTree T )
{
if ( NULL == T )
{
T = ( SearchTree )malloc( sizeof( struct TreeNode ) );
if ( NULL == T )
{
printf("malloc fail FILE:%s,LINE:%s",__FILE__,__FILE__);
}
else
{
T->Element = X;
T->Left = NULL;
T->Right = NULL;
}
}
else
{
if ( X < T->Element )
{
T->Left = Insert( X, T->Left);
}
if ( X > T->Element )
{
T->Right = Insert( X, T->Right );
}
}
return T;
}
DoubleList SearchTreeToDoubleList(SearchTree T)
{
Stack St;
//SearchTree P;
DoubleList Head = NULL, Cur, Pre = NULL;
St = NewStack();
Cur = T;
while(Cur || !IsEmpty(St))
{
while(NULL != Cur)
{
Push(St, Cur);
Cur = Cur->Left;
}
if (!IsEmpty(St))
{
Cur = Pop(St);
//printf("%3d",Cur->Element);
if (NULL == Pre)
{
Head = Cur;
Cur->Left =NULL;
}
else{
Pre->Right = Cur;
Cur->Left = Pre;
}
Pre = Cur;
Cur = Cur->Right;
}
}
Pre->Right = NULL;
return Head;
}