后序+中序,先序+中序,建立二叉树

建立二叉树(链式存储)

一、给定后序和中序数列,建立二叉树

 1 #include<iostream>
 2 #include<vector>
 3 #include<unordered_map> 
 4 using namespace std;
 5 typedef struct node* BT; 
 6 struct node{
 7     int data;
 8     BT left=NULL,right=NULL;
 9 };
10 
11 vector<int> Post,In;//存储后序遍历和中序遍历的元素
12 unordered_map<int,int> mp;//映射中序数组和下标的关系
13  
14 BT BuildTree(int PostIndex,int InLeft,int InRight);
15 void Postorder(BT t);//后序遍历输出,用于检测正确性 
16 
17 int main(void)
18 {
19     int N;
20     scanf("%d",&N);
21     Post.resize(N+1);
22     In.resize(N+1);
23     for(int i=1;i<=N;i++)
24         scanf("%d",&Post[i]);
25     for(int i=1;i<=N;i++){
26         scanf("%d",&In[i]);
27         mp[In[i]]=i;
28     }
29     BT tree=NULL;
30     tree=BuildTree(N,1,N);
31     Postorder(tree);
32     return 0;
33  } 
34 
35 void Postorder(BT t)
36 {
37     if(t!=NULL){
38         Postorder(t->left);
39         Postorder(t->right);
40         printf("%d ",t->data);
41     }
42 }
43 
44 BT BuildTree(int PostIndex,int InLeft,int InRight)
45 {
46     if(InLeft>InRight) return NULL;
47     BT t=new node();
48     t->data=Post[PostIndex];
49     t->right=BuildTree(PostIndex-1,mp[Post[PostIndex]]+1,InRight);
50     int next=PostIndex-InRight+mp[Post[PostIndex]]-1;//下一个元素在Post中的位置即当前节点的PostIndex减去它的右子树的元素个数再-1 
51     t->left=BuildTree(next,InLeft,mp[Post[PostIndex]]-1);
52     return t;
53 }

 

二、给定先序和中序数列,建立二叉树

#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
typedef struct node *BT;
struct node{
    int data;
    BT left=NULL,right=NULL;
};

vector<int> Pre,In;
unordered_map<int,int> mp;

void Preorder(BT t);
BT BuildTree(int PreIndex,int InLeft,int InRight);

int main(void)
{
    int N;
    scanf("%d",&N);
    Pre.resize(N+1);
    In.resize(N+1);
    for(int i=1;i<=N;i++)
        scanf("%d",&Pre[i]);
    for(int i=1;i<=N;i++){
        scanf("%d",&In[i]);
        mp[In[i]]=i;
    }
    BT tree=BuildTree(1,1,N);
    Preorder(tree);
    return 0;
}

void Preorder(BT t)
{
    if(t!=NULL){
        printf("%d ",t->data);
        Preorder(t->left);
        Preorder(t->right);
    }
}

BT BuildTree(int PreIndex,int InLeft,int InRight)
{
    if(InLeft>InRight) return NULL;
    BT t=new node();
    t->data=Pre[PreIndex];
    t->left=BuildTree(PreIndex+1,InLeft,mp[Pre[PreIndex]]-1);
    int next=PreIndex+mp[Pre[PreIndex]]-InLeft+1;
    t->right=BuildTree(next,mp[Pre[PreIndex]]+1,InRight);
    return t;
}

 

posted @ 2019-03-10 13:00  大众名字重名太多  阅读(911)  评论(0编辑  收藏  举报