美文网首页
ACM----已知前序遍历序列和后序遍历序列求后序遍历序列

ACM----已知前序遍历序列和后序遍历序列求后序遍历序列

作者: 不过意局bugyj | 来源:发表于2019-02-28 16:19 被阅读0次

很是激动,离开ACM一年后还能找回当时ac时激动的感觉。虽然挺简单的一题,在苦思冥想之后想到左右子树分治采用递归解法。一次Compilation Error后就ac了。就算是重启刷题的开门红吧。

这是原题:ZOJ-1944

答案:

//
// Created by PC on 2019/2/28.
// 通过前序遍历和中序遍历字母树获得的字符串获取后序遍历的字符串!
// 深思熟虑后觉得应该用递归
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
// DBACEGF ABCDEFG
stack<char> post;

//先找出每个子树的根节点,然后获取其左子树和右子树
void separateSubTree(char preOrder[], char inOrder[]) {

    // 这是递归的判断
    if(strlen(preOrder) == 0) {
        return;
    }
    post.push(preOrder[0]);

    // 根节点就是preOrder的第一个字母,根据根节点从inOrder中分成左右子树
    // 这里的教训惨重啊,字符数组不赋初值,就会被自动赋一些乱七八糟的值,影响后面的结果!
    char inLeft[20] = "", inRight[20] = "";
    char preLeft[20] = "", preRight[20] = "";
    char* middle = strchr(inOrder, preOrder[0]);

    // 左子树
    memcpy(inLeft, inOrder, middle - inOrder);

    // 右子树
    memcpy(inRight, middle + 1, strlen(inOrder) - 1 - (middle - inOrder));

    //前面都是中序遍历的左右子树!下面获取前序遍历的左右子树,获取后直接再调用本方法获取就行了
    // 左子树
    memcpy(preLeft, preOrder + 1, strlen(inLeft));

    // 右子树
    memcpy(preRight, preOrder + strlen(inLeft) + 1, strlen(inRight));

    separateSubTree(preRight, inRight);
    separateSubTree(preLeft, inLeft);
}

int main() {
    char preOrder[27], inOrder[27];
    while (scanf("%s %s", preOrder, inOrder) != EOF) {
        // int postOrder[27];
        separateSubTree(preOrder, inOrder);
        //cout << post.size() << endl;
        while (!post.empty()) {
            cout << post.top();
            post.pop();
        }
        cout << endl;
    }
    return 0;
}

相关文章

  • ACM----已知前序遍历序列和后序遍历序列求后序遍历序列

    很是激动,离开ACM一年后还能找回当时ac时激动的感觉。虽然挺简单的一题,在苦思冥想之后想到左右子树分治采用递归解...

  • 二叉树-3

    今天解决了人生导师留给我的第一个问题——通过前序遍历和中序遍历序列,求解后序遍历序列。 思路:D&C 对于二叉树,...

  • 先序,中序序列 推导后序序列

    Problem Description 输入二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列。 In...

  • 二叉树的遍历

    递归: 非递归: 无论是先序遍历序列还是后序遍历序列还是层次遍历序列,都必须知道中序遍历序列才能唯一确定一棵树。 ...

  • 二叉树考虑空节点的遍历

    通常我们进行二叉树的遍历(前序遍历、中序遍历和后序遍历)时,不考虑空节点。但有时需要我们将空节点也放入遍历序列中。...

  • 重建二叉树 - 利用后序遍历与中序遍历C++实现

    重建二叉树 引言 问题:现有二叉树的后序遍历序列与中序遍历序列,能否求原二叉树? 答案是肯定的,并且前序与中序也可...

  • 二叉树的前序,中序,后序遍历

    前序遍历:根左右中序遍历:左根右后序遍历:左右根 前序遍历 中序遍历 后序遍历

  • N叉树的后序遍历

    题目: 题目的理解: 后序遍历和前序遍历遍历理解:前序遍历:先保存值,然后遍历子节点。后序遍历:先遍历子节点,然后...

  • 建树与输出 树的遍历 已知后序遍历和中序遍历求层序遍历

  • 根据两个traversal恢复二叉树

    已知前序和中序遍历: 递归版本: 非递归版本: 已知后序和中序遍历:非递归:

网友评论

      本文标题:ACM----已知前序遍历序列和后序遍历序列求后序遍历序列

      本文链接:https://www.haomeiwen.com/subject/huuhuqtx.html