题目描述
输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表。而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现。
二叉搜索树,左子结点的值总是小于父结点的值,右子结点的值总是大于父结点的值。
解题思路
如果用中序遍历二叉搜索树,遍历结点的顺序就是从小到大。所以这题的基本思路就是:用中序遍历一下二叉树,同时保留当前链表的最后一个指针pLast,以及当前指针pCurrent,每访问一个节点更新一下两者的值。
代码实现
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
typedef struct TreeNode
{
int data;
TreeNode *Leftchild;
TreeNode *Rightchild;
}TreeNode, *PtreeNode;
PtreeNode InsertSortTree(PtreeNode Tree, int data)
{
if(Tree == NULL)
{
Tree = new TreeNode;
Tree->data = data;
Tree->Leftchild = NULL;
Tree->Rightchild = NULL;
}
if(Tree->data > data)
Tree->Leftchild = InsertSortTree(Tree->Leftchild, data);
if(Tree->data < data)
Tree->Rightchild = InsertSortTree(Tree->Rightchild, data);
return Tree;
}
PtreeNode CreatSortTree(PtreeNode Tree)
{
srand(time(NULL));
cout << "generate 10 rand num" << endl;
for(int i = 0; i < 10; i ++)
{
int data = rand()%100 + 1;
cout << data << " ";
Tree = InsertSortTree(Tree, data);
}
cout << endl;
return Tree;
}
void PreOrderTraverse(PtreeNode Tree)
{
if(Tree == NULL)
return;
PreOrderTraverse(Tree->Leftchild);
cout << Tree->data << " ";
PreOrderTraverse(Tree->Rightchild);
}
void CoverToList(PtreeNode Tree, PtreeNode *lastNode)
{
if(Tree == NULL)
return;
PtreeNode pCurrent = Tree;
if(pCurrent->Leftchild != NULL)
CoverToList(pCurrent->Leftchild, lastNode);
pCurrent->Leftchild = *lastNode;
if((*lastNode) != NULL)
(*lastNode)->Rightchild = pCurrent;
*lastNode = pCurrent;
if(pCurrent->Rightchild != NULL)
CoverToList(pCurrent->Rightchild, lastNode);
}
PtreeNode Cover(PtreeNode Tree)
{
PtreeNode lastNode = NULL;
CoverToList(Tree, &lastNode);
PtreeNode pHeadList = lastNode;
while(pHeadList != NULL && pHeadList->Leftchild != NULL)
pHeadList = pHeadList->Leftchild;
return pHeadList;
}
void Print_Tree(PtreeNode Tree)
{
cout << "Sort Tree is :" << endl;
PreOrderTraverse(Tree);
}
void Print_List(PtreeNode List)
{
cout << "Cover to List is :" << endl;
while(List != NULL)
{
cout << List->data << " ";
List = List->Rightchild;
}
cout << endl;
}
int main(int argc, char const *argv[])
{
PtreeNode Tree = NULL;
Tree = CreatSortTree(Tree);
Print_Tree(Tree);
Tree = Cover(Tree);
Print_List(Tree);
return 0;
}