我们可以中序遍历整棵树。按照这个方式遍历树,比较小的结点先访问。如果我们每访问一个结点,假设之前访问过的结点已经调整成一个排序双向链表,我们再把调整当前结点的指针将其链接到链表的末尾。当所有结点都访问过之后,整棵树也就转换成一个排序双向链表了。
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
typedef struct BSTNode
{
char data;
BSTNode *lchild;
BSTNode *rchild;
}BSTNode;
void ConvertNode(BSTNode *bt,BSTNode **lastNode)
{
if(bt == NULL) return ;
BSTNode *temp = bt;
if(temp->lchild != NULL)
{
ConvertNode(temp->lchild,lastNode);
}
temp->lchild = *lastNode;
if(*lastNode != NULL)
{
(*lastNode)->rchild = temp;
}
*lastNode = temp;
if(temp->rchild != NULL)
{
ConvertNode(temp->rchild,lastNode);
}
}
BSTNode *Convert(BSTNode *bt) //需要返回头结点
{
BSTNode *lastNode = NULL;
ConvertNode(bt,&lastNode);
BSTNode *head = lastNode;
while(head != NULL&&head->lchild != NULL)
{
head = head->lchild;
}
return head;
}
int main()
{
return 0;
}