zoukankan      html  css  js  c++  java
  • 后序+中序,先序+中序,建立二叉树

    建立二叉树(链式存储)

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

     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;
    }
  • 相关阅读:
    D
    NOI 1.7编程基础之字符串(35题)
    HYSBZ 2145 悄悄话
    POJ 2406 Power Strings
    POJ 3461 Oulipo[附KMP算法详细流程讲解]
    POJ 3974 Palindrome
    POJ 1002 487-3279
    POJ 1182 食物链
    POJ 2524 Ubiquitous Religions
    HDU 1251 统计难题
  • 原文地址:https://www.cnblogs.com/yinhao-ing/p/10504965.html
Copyright © 2011-2022 走看看