题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*说明:本文参考http://blog.csdn.net/chdhust/article/details/8175480
主要思想是递归思路
*/
typedef struct BiNode
{
struct BiNode* lNode;
struct BiNode* rNode;
int data;
}*BiTree;
void createTree(BiTree &T, int *data, int pos, int len)
{
if (pos >= len)
{
T = NULL;
return;
}
T = (BiTree)malloc(sizeof(BiNode));
T->data = data[pos];
T->lNode = NULL;
T->rNode = NULL;
createTree(T->lNode, data, pos*2+1, len);
createTree(T->rNode, data, pos*2+2, len);
}
/*先序,中-->左-->右*/
void preOrderTree(BiTree T)
{
if (T == NULL)
{
return;
}
printf("%d \t", T->data);
preOrderTree(T->lNode);
preOrderTree(T->rNode);
}
/*中序,左-->中-->右*/
void inOrderTree(BiTree T)
{
if (T == NULL)
{
return;
}
inOrderTree(T->lNode);
printf("%d \t", T->data);
inOrderTree(T->rNode);
}
/*后序,左-->右-->中*/
void postOrderTree(BiTree T)
{
if (T == NULL)
{
return;
}
postOrderTree(T->lNode);
postOrderTree(T->rNode);
printf("%d \t", T->data);
}
/*说明:T为转换的树, lastListNode为双向链表的尾结点*/
void convertTreeToList(BiTree T, BiTree &lastListNode)
{
BiNode* curNode = NULL;
if (T == NULL)
{
return;
}
/*按照中序处理*/
curNode = T;
if (curNode->lNode != NULL)
{
convertTreeToList(curNode->lNode, lastListNode);
}
/*把当前结点添加到尾结点*/
curNode->lNode = lastListNode;
if (lastListNode != NULL)
{
lastListNode->rNode = curNode;
}
/*更新尾结点*/
lastListNode = curNode;
if (curNode->rNode != NULL)
{
convertTreeToList(curNode->rNode, lastListNode);
}
}
/*将树T转换为双向链表,返回双向链表的头结点*/
BiTree convert(BiTree T)
{
BiTree doubleList = NULL;
convertTreeToList(T, doubleList);
/*转换后所指向的结点为尾结点,需要找到头结点*/
while (doubleList!=NULL && doubleList->lNode!=NULL)
{
doubleList = doubleList->lNode;
}
return doubleList;
}
void printList(BiTree list)
{
BiTree p = list;
while (p != NULL)
{
printf("%d\t", p->data);
p = p->rNode;
}
printf("\n");
}
int main()
{
BiTree T = NULL;
BiTree list = NULL;
int data[] = {10, 6, 14, 4, 8, 12, 16};
createTree(T, data, 0, 7);
printf("前序遍历树:\n");
preOrderTree(T);
printf("\n");
printf("中序遍历树:\n");
inOrderTree(T);
printf("\n");
printf("后序遍历树:\n");
postOrderTree(T);
printf("\n");
list = convert(T);
printf("将树转换为双向链表后:\n");
printList(list);
return 0;
}