根据后序和中序遍历输出先序遍历 (二叉树遍历)

分析二叉树遍历的性质

根据后序和中序遍历输出先序遍历:
在这里插入图片描述
由上述性质,易做:

题目

在这里插入图片描述

code:

#include<iostream>
using namespace std;
const int N = 110;

void make_a(int *c,int *b,int n){
         if(n == 0) return;  
         int x = c[n-1];
         int i;
         for(i=0;i<n;i++)
               if(b[i] == x) break;
         cout << " " << x;
         make_a(c,b,i);
         make_a(c+i,b+i+1,n-i-1);   // 后缀是从c+i开始,是因为后缀删除的根节点是最后一个节点,并不是第i个节点,所以后缀时仍要用第i个节点,但是不需要用最后一个节点
                                    // 中缀要把第i个结点删除,所以中缀表达式是从i+1个元素开始的;(即后缀每次删最后元素,中缀删掉是中间元素)
}

int main(){
    int b[N],c[N];  // b->中缀    c->后缀
    int n;
    cin >> n;
    for(int i=0;i<n;i++)
        cin >> c[i];
    for(int i=0;i<n;i++)
        cin >> b[i];
    cout << "Preorder:";
    make_a(c,b,n);
    return 0;
}


attention:

分析后缀、中缀有差别(因为元素的位置不同)
后缀是从第i个元素(即元素c+i)开始,是因为后缀删除的根节点是最后一个节点,并不是第i个节点,所以后缀时仍要用第i个节点,但是不需要用最后一个节点
中缀要把第i个结点删除,所以中缀表达式是从i+1个元素(即元素b+i+1)开始的;(即后缀每次删最后元素,中缀删掉是中间元素)

ps

补充:树的计数

已知先序序列和中序序列可确定一棵唯一的二叉树;

已知后序序列和中序序列可确定一棵唯一的二叉树;

已知先序序列和后序序列不能确定一棵唯一的二叉树。

improve: 根据前序和中序遍历输出先序遍历 -> 传送门


版权声明:本文为weixin_51942493原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。