zoukankan      html  css  js  c++  java
  • 通过先序和中序创建二叉树

    #include"iostream"
    #include"queue"
    using namespace std;
    int x[1000],z[1000];
    struct Tree{
        int data;
        Tree *left,*right;
    };
    void xzCreate(Tree* &t,int xl,int zl,int len){        //xl:先序起始下标,zl:中序起始下标,len:数组长度
        //cout<<"zl:"<<zl<<ends<<"xl:"<<xl<<ends<<"len:"<<len<<endl;
        if(len == 1){
            t = new Tree;
            t->data = z[zl];
            t->left = NULL;
            t->right = NULL;
            return ;
        }
        for(int i = 0;z[i + zl] != x[xl];i++);        //首先在中序中找到根结点,先序第一个结点就是根结点,所以有z[i + zl] != x[xl]
        if(i >= len){    //遍历完数组还没找到根结点,就是输入错误直接返回
            return ;
        }
        //创建根节点
        t = new Tree;
        t->data = z[i + zl];
        t->left = NULL;
        t->right = NULL;
    
        int lenl = i;            //左子树长度就是i遍历的长度
        int lenr = len - lenl - 1;        //右子树长度为 : 总长度 - 左子树长度 - 根结点
                                //中序的左子树起点从最左开始,所以还是它本身
        xl = xl + 1;            //先序中:左子树起点 = 右子树起点 + 根结点,  跳过根节点即是左子树起点
        int zr = lenl + zl + 1;    //中序中:右子树起点 = 左子树起点 + 左子树长度 + 根结点
        int xr = xl + lenl;        //先序中:右子树起点 = 左子树起点 + 左子树长度
        //cout<<"lenl:"<<lenl<<ends<<"lenr:"<<lenr<<ends<<"zl:"<<zl<<ends<<"xl:"<<xl<<ends<<"zr:"<<zr<<ends<<"xr:"<<xr<<endl;
        //递归建树
        if(lenl != 0){
            xzCreate(t->left,xl,zl,lenl);
        }
        if(lenr != 0){
            xzCreate(t->right,xr,zr,lenr);
        }
    }
    
    void show(Tree* &t){
        if(t){
            cout<<t->data<<ends;
            show(t->left);
            show(t->right);
        }
    }
    //层次遍历
    void sqshow(Tree *t){
        queue<Tree*> q;
        Tree *p = t;
        q.push(p);
        while(!q.empty()){
            p = q.front();
            cout<<p->data<<ends;
            if(p->left){
                q.push(p->left);
            }
            if(p->right){
                q.push(p->right);
            }
            q.pop();
        }
        cout<<endl;
    }
    
    int main(){
        Tree *t;
        int num = 7;
        for(int i = 0;i < num;i++){
            cin>>x[i];
        }
        for(i = 0;i < num;i++){
            cin>>z[i];
        }
        xzCreate(t,0,0,num);
        sqshow(t);
        return 0;
    }
    
    /*
    1 2 4 5 3 6 7
    4 2 5 1 6 3 7
    
    */
  • 相关阅读:
    zr#955 折纸
    zr#954 分组
    p2513 [HAOI2009]逆序对数列
    p4161 [SCOI2009]游戏
    p4593 [TJOI2018]教科书般的亵渎
    622FThe Sum of the k-th Powers
    spoj1811 LCS
    后缀自动机
    p5342 [TJOI2019]甲苯先生的线段树
    p5339 [TJOI2019]唱、跳、rap和篮球
  • 原文地址:https://www.cnblogs.com/oleolema/p/9078051.html
Copyright © 2011-2022 走看看