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

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

#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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值