把二元查找树转变成排序的双向链表

来源:互联网 发布:淘宝买衣服靠谱吗 编辑:程序博客网 时间:2024/06/14 09:02

题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。

#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;}


0 0