码迷,mamicode.com
首页 > 其他好文 > 详细

南阳 oj 重建二叉树 题目756

时间:2015-08-03 22:50:42      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:


#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("\n");
  }
  return 0;
}       

版权声明:本文为博主原创文章,未经博主允许不得转载。

南阳 oj 重建二叉树 题目756

标签:

原文地址:http://blog.csdn.net/yueloveme/article/details/47262121

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!