NYOJ756 重建二叉树

题目描述: 给你一颗二叉树的后序序列和中序序列, 求它的前序序列;

 

样例输入: ACBFGED ABCDEFG

样例输出: DBACEGF


分析:

先复习一下前序遍历, 中序遍历, 后序遍历的次序

  • 前序遍历:1.访问根节点。2.访问左子树。3.访问右子树
  • 中序遍历:1.访问左子树。2.访问根节点。3.访问右子树
  • 后序遍历:1.访问左子树。2.访问右子树。3.访问根节点

先用手工试算出这个前序序列

扫描二维码关注公众号,回复: 4117266 查看本文章

后序遍历: ACBFGED

中序遍历: ABCDEFG

第一步由后序遍历的最后一个元素知道整棵树最初的根节点为D    

第二步:

由中序序列知道左子树是{A,B,C}, 右子树是{E,F,G}

重复一二两步,

知道E是右子树的根节点,并存在右子树,没有左子树

反复套用一二两步规则,最终可得到整颗树


既然知道手算是如何算的,算法实现起来就方便多了

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<malloc.h>
using namespace std;
struct node {
  char data;
  node *left, *right;
};
// 构造一颗树 
void CreatTree(char *last, char *middle, node *&t, int len) {
  if (len == 0) {
    t = NULL;
    return;
  }
  char c = last[len - 1];//取出后序序列中最后一个节点 
  int pos = 0;
  while (c != middle[pos]) {//找出该节点在中序序列的位置 
    pos++;
  }
  t = (node*)malloc(sizeof(node));
  t->data = c;
  CreatTree(last, middle, t->left, pos);
  CreatTree(last + pos, middle + pos + 1, t->right, len - pos - 1);
}


// 打印前序序列 
void Print(node *t) {
  if (t != NULL) {
    cout << t->data;
    Print(t->left);
    Print(t->right);
  }
}
int main() {
  char last[100], middle[100];
  while (scanf("%s%s", last, middle) != EOF) {
    node *t = NULL;
    CreatTree(last, middle, t, strlen(last));
    Print(t);
    printf("\n");
  }
}


猜你喜欢

转载自blog.csdn.net/qq799028706/article/details/79546936