1、二叉树的前序中序转后序:

先通过前序中序建树,再进行后序遍历。

(1)建树:每次记录先序遍历的根,中序遍历的范围;

先找到根在中序遍历中的位置,然后找到左子树,右子树;

分别找到左子树的根和范围与右子树的根和范围。

递归下去,直到st>ed.

(2)后序遍历;

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
using namespace std;
vector <int> level(10000,-1);
struct Node{
    int data;
    struct Node *Left,*Right;
};
typedef struct Node* Tree;
Tree T;
int pre[1000],in[1000],n;
Tree f(int root,int st,int ed)
{
    int i,d;
    if(st>ed) return NULL;
    Tree tp=(Tree)malloc(sizeof(struct Node));
    tp->data=pre[root];
    for(i=st;i!=ed;i++) if(pre[root]==in[i]) break;
    tp->Left=f(root+1,st,i-1);
    tp->Right=f(root+(i-st)+1,i+1,ed);
    return tp;
}
void Print(Tree T)
{
    if(T!=NULL)
    {
        Print(T->Left);
        Print(T->Right);
        printf("%d ",T->data);
    }
}
int main(void)
{
    int i,j;
    scanf("%d",&n);
    for(i=0;i<n;i++) scanf("%d",&pre[i]);
    for(i=0;i<n;i++) scanf("%d",&in[i]);
    Tree T=f(0,0,n-1);
    Print(T);
    return 0;
} 

/*
7
1 2 4 5 3 6 7
4 2 5 1 6 3 7
*/
View Code

相关文章:

  • 2022-02-07
  • 2021-08-09
  • 2022-02-07
  • 2021-08-02
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-25
猜你喜欢
  • 2021-11-21
  • 2021-12-25
  • 2021-12-25
  • 2021-12-25
  • 2022-12-23
  • 2021-10-17
  • 2019-12-27
相关资源
相似解决方案