二叉树遍历序列还原

成绩 10 开启时间 2017年11月6日 星期一 12:20
折扣 0.8 折扣时间 2017年11月28日 星期二 18:20
允许迟交 关闭时间 2018年01月8日 星期一 18:20

给出二叉树的中序遍历序列和后序遍历序列,编程还原该二叉树。

输入:
  第1行为二叉树的中序遍历序列
  第2行为二叉树的后序遍历序列

输出:
  二叉树的按层遍历序列

  测试输入关于“测试输入”的帮助 期待的输出关于“期待的输出”的帮助 时间限制关于“时间限制”的帮助 内存限制关于“内存限制”的帮助 额外进程关于“{$a} 个额外进程”的帮助
测试用例 1 以文本方式显示
  1. badcfeg↵
  2. bdfgeca↵
以文本方式显示
  1. abcdefg↵
1秒 64M 0
测试用例 2 以文本方式显示
  1. cbdafeg↵
  2. cbdfgea↵
以文本方式显示
  1. adebfgc↵
1秒 64M 0
测试用例 3 以文本方式显示
  1. edcba↵
  2. edcba↵
以文本方式显示
  1. abcde↵
1秒 64M 0
测试用例 6 以文本方式显示
  1. bdfgeca↵
  2. gfedcba↵
以文本方式显示
  1. abcdefg↵
1秒 64M 0
     
    此题有一定的借鉴成分。
    这题多写了几个与本体无关的函数。BuildTree这个函数是有用的俄,而PostMidCreateTree这个函数是从网上看到的,但没成功。
InOrderTravers这个函数是因为当时没看懂题就写了个中序遍历,其实应该是Leveltravers这个函数
#include <string>   
#include <iostream>   
#include<queue> 
using namespace std; 
 
//二叉链表表示二叉树   
typedef struct BiNode 
{ 
    char data;//节点数据   
 struct BiNode * lchild;//左孩子   
 struct BiNode * rchild;//右孩子   
}BiNode, *BiTree; 
 
void BuildTree(BiTree &t,string Inorder,string Postorder) 
{ 
  if (Inorder.length()==0) 
   { 
      //t = NULL; 
        return; 
    } 
  int length_Post = Postorder.length(); 
  char Rootnode = Postorder[length_Post- 1]; 
 int index = Inorder.find(Rootnode); 
    string lchild_inorder = Inorder.substr(0, index);//左孩子的中序序列 
    string rchild_inorder = Inorder.substr(index + 1);//右孩子的中序序列 
   int lchild_length = lchild_inorder.length();//左孩子长度 
    int rchild_length = rchild_inorder.length();//右孩子长度 
    string rchild_postorder = Postorder.substr(lchild_length, length_Post - 1 - lchild_length);//右孩子的后序序列 
  string lchild_postorder = Postorder.substr(0,lchild_length);//左孩子的后序序列 
 
    t = (BiTree)malloc(sizeof(BiNode)); 
    if (t) 
 { 
      t->data = Rootnode; t->lchild = t->rchild = NULL; 
     BuildTree(t->lchild,lchild_inorder,lchild_postorder);//创建左孩子 
        BuildTree(t->rchild, rchild_inorder, rchild_postorder);//创建右孩子 
  } 
} 
 
char post[50]; 
char mid[50]; 
int Position(char c) 
 { 
     return strchr(mid, c) - mid; 
 
} 
void PostMidCreateTree(BiTree &pn, int i, int j, int len) 
{ 
     if (len <= 0) 
         return; 
 
  pn = new BiNode; pn->lchild = pn->rchild = NULL; 
     pn->data = post[i]; 
     int m = Position(post[i]); 
     PostMidCreateTree(pn->lchild, i - 1 - (len - 1 - (m - j)), j, m - j);//注意参数:m-j左子树的长度,len-1-(m-j)右子树的长度 
     PostMidCreateTree(pn->rchild, i - 1, m + 1, len - 1 - (m - j)); 
 } 
 
void InOrderTraverse(BiTree & t) 
{ 
 if (t != NULL) 
 { 
 
     InOrderTraverse(t->lchild); 
     cout << t->data; 
      InOrderTraverse(t->rchild); 
 } 
} 
 
void leveltravers(BiTree t) 
{ 
 queue<BiTree> Q; 
 BiTree cur = t; 
    Q.push(cur); 
   while (!Q.empty()) 
 { 
      cur = Q.front(); 
       Q.pop(); 
       printf("%c", cur->data); 
 
       if (cur->lchild) 
        { 
          Q.push(cur->lchild); 
        } 
      if (cur->rchild) 
            Q.push(cur->rchild); 
    } 
} 
int main() 
{ 
    BiTree t; 
  string Inorder; 
    string Postorder; 
  getline(cin, Inorder); 
 getline(cin, Postorder); 
   BuildTree(t, Inorder, Postorder); 
  leveltravers(t); 
   printf("\n"); 
  return 0; 
}  


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水之积也不厚,则其负大舟也无力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值