• nyoj 756 重建二叉树


    重建二叉树

    时间限制:1000 ms  |  内存限制:65535 KB

    难度:3

    描述

    题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!)。

    输入

    输入有多组数据(少于100组),以文件结尾结束。
    每组数据仅一行,包括两个字符串,中间用空格隔开,分别表示二叉树的后序和中序序列(字符串长度小于26,输入数据保证合法)。

    输出

    每组输出数据单独占一行,输出对应得先序序列。

    样例输入

    ACBFGED ABCDEFG

    CDAB CBAD

    样例输出

    DBACEGF

    BCAD

    #include <stdio.h>
    #include <malloc.h>
    #include <string.h>
    //二叉链表
    typedef struct node{
      char data;//节点数据元素
      struct node *lchild;//指向左孩子
      struct node *rchild;//指向右孩子
    }BiNode,*BTree;
    //利用后序和中序建立二叉树
    void GetPreOrder(char *last,char *mid,BTree &T,int len)
    {
      if(len==0)
      {
        T = NULL;
        return;
      }
      //取出后序序列中的最后一个节点
      char ch=last[len-1];
      int index=0;
      //在中序序列中进行查找根节点,并用index记录其在序列中的索引
      while(mid[index]!=ch)
      {
        index++;
      }
      //给根节点分配空间
      T=(BTree)malloc(sizeof(BiNode));
      T->data=mid[index];
      //建立左子树
      GetPreOrder(last,mid,T->lchild,index);
      //建立右子树
      GetPreOrder(last+index,mid+index+1,T->rchild,len-index-1);
    }
    void GetPostOrder(char *prim,char *mid,BTree &T,int len)
    {
      if(len==0)
      {
        T=NULL;
        return;
      }
      //提出先序序列中的第一个节点
      char ch=prim[0];
      int index=0;
      //在中序序列中查找当前根节点,并用index记录其在序列中的位置
      while(mid[index]!=ch)
      {
        index++;
      }
      //给根节点分配空间
      T=(BTree)malloc(sizeof(BiNode));
      T->data=mid[index];
      //建立左子树
      GetPostOrder(prim+1,mid,T->lchild,index);
      //建立右子树
      GetPostOrder(prim+index+1,mid+index+1,T->rchild,len-index-1);
    }
    //先序输出二叉树
    void PreOrder(BTree T)
    {
      if(T!=NULL)
      {
        printf("%c",T->data);
        PreOrder(T->lchild);
        PreOrder(T->rchild);
      }
    }
    //后序输出二叉树
    void PostOrder(BTree T)
    {
      if(T!=NULL)
      {
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        printf("%c",T->data);
      }
    }
    int main()
    {
      char first[26],mid[26],last[26];
      while(scanf("%s%s",last,mid)!=EOF)
      {
        BTree T=NULL;
        GetPreOrder(last,mid,T,strlen(last));
        PreOrder(T);
    // 		GetPostOrder(last,mid,T,strlen(last));
    // 		PostOrder(T);
        printf("
    ");
      }
      return 0;
    }        
    

      

  • 相关阅读:
    WCF步步为营(三):使用配置文件改变使用服务的方式
    WCF步步为营(五):数据契约
    弹性工作制下的IT项目管理
    C#拾遗系列(8):异常
    WCF步步为营(一):简单示例
    敏捷的 "道"
    从中国男足看项目管理
    WCF步步为营(二):使用配置文件改变发布服务的方式
    WCF步步为营(四):客户端使用代理类使用服务
    C#拾遗系列(9):继承、接口、扩展方法、分部类、类操作、Ref and Out、可空类型
  • 原文地址:https://www.cnblogs.com/zhangliu/p/7053078.html
Copyright © 2020-2023  润新知