【模板】已知二叉树两种序列求另外一种序列–非建树

思路:
给出二叉树的先序和中序遍历
要求求出后序遍历
我们知道根据先序遍历和另外一种遍历我们
可以建立以可二叉树,但是应该存在一种更简单的
办法使得不用建树也能够成功得到序列

首先我们都知道:

  1. 先序遍历的第一个结点一定是根节点
  2. 后序遍历的最后一个结点一定是根节点

我们只需要在中序遍历中找到该根节点
该节点的左边是左子树,右边是右子树
递归即可

根据先序和中序求解后序

// 根据先序求后后续遍历 k = i - p;
void postorder(int x,int y,int p,int q)
{
    printf("此时  后序区间为[%d, %d],中序区间[%d, %d]\n",x , y , p , q);
    if(x > y || p > q)return;
    int i = a.find(b[x]); // 在中序遍历中找到当前先序区间中的第一个
    printf("此时 i = %d \n",i);
    int k = i - p;
    postorder(x + 1, x + k, p , i - 1);
    postorder(x + k + 1, y, i + 1,  q);
    cout << b[x];
}

根据后序和中序求先序

// 根据后续求先序 k = p - i    
void preorder(int x,int y,int p,int q)
{
    //printf("此时  后序区间为[%d, %d],中序区间[%d, %d]\n",x , y , p , q);
    if(x > y || p > q)return;
    int i = a.find(b[y]); // 在中序遍历中找到当前先序区间中的第一个
    //printf("此时 i = %d\n",i);
    cout << b[y];
    int k = q - i;
    preorder(x , y - k - 1, p , i - 1);
    preorder(y - k, y - 1,i + 1,  q);
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
const int N = 100;
string a , b;
int n;

// 根据先序求后序遍历 k = i - p;
void postorder(int x,int y,int p,int q)
{
    printf("此时  后序区间为[%d, %d],中序区间[%d, %d]\n",x , y , p , q);
    if(x > y || p > q)return;
    int i = a.find(b[x]); // 在中序遍历中找到当前先序区间中的第一个
    printf("此时 i = %d \n",i);
    int k = i - p;
    postorder(x + 1, x + k, p , i - 1);
    postorder(x + k + 1, y, i + 1,  q);
    cout << b[x];
}

// 根据后序求先序 k = p - i    
void preorder(int x,int y,int p,int q)
{
    //printf("此时  后序区间为[%d, %d],中序区间[%d, %d]\n",x , y , p , q);
    if(x > y || p > q)return;
    int i = a.find(b[y]); // 在中序遍历中找到当前先序区间中的第一个
    //printf("此时 i = %d\n",i);
    cout << b[y];
    int k = q - i;
    preorder(x , y - k - 1, p , i - 1);
    preorder(y - k, y - 1,i + 1,  q);
}   
int main()
{
    cin >> a >> b;
    n = a.size() - 1; // 注意这里的 n 去 size() - 1 !!!, 且下标从 0 开始
    preorder(0,n,0,n);
    return 0;
}


原文链接: https://www.cnblogs.com/wlw-x/p/12932595.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    【模板】已知二叉树两种序列求另外一种序列--非建树

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/350014

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午6:02
下一篇 2023年3月2日 上午6:03

相关推荐