• 中序+先序构造二叉树,后序遍历


    #include<cstdlib>
    #include<cstdio>
    #include<cstring>
    
    using namespace std;
    char preorder[30];
    char inorder[30];
    int left[30];//相当于链表中指针的作用
    int right[30];
    
    int buildtree(int L1,int R1,int L2,int R2){
       // printf("*l %s *y%s",preorder,inorder);
        //if(L1>R1) return 0;//
        if(L1>R1) return -1;//因为0要代表我们的结点'A',不用作为空的标记,我们用-1表示空
        int p=L2;
        while(preorder[L1]!=inorder[p]) p++;
        int root=preorder[L1]-'A';
    
        int len=p-L2;
        left[root]=buildtree(L1+1,L1+len,L2,p-1);//递归构造左子树
       //right[root]=buildtree(R1-len+1,R1,p+1,R2);//递归构造右子树 错误的递归关系
        right[root]=buildtree(L1+1+len,R1,p+1,R2);//递归构造右子树
        //[(L1),L1+1,L1+len,L1+1+len,R1]
        //[L2,p-1,(p),p+1,R2]
    }
    void postra(int root){
       
        if(left[root]!=-1) postra(left[root]);
        if(right[root]!=-1) postra(right[root]);
        printf("%c",root+'A');
    
    }
    int main(){
        while(scanf("%s %s",preorder,inorder)!=EOF){
               // memset(left,99,sizeof(left));//memset只能赋值为0 或者 -1;
               // memset(right,99,sizeof(right));
                memset(left,-1,sizeof(left));//memset只能赋值为0 或者 -1;
                memset(right,-1,sizeof(right));
            int root=buildtree(0,strlen(preorder)-1,0,strlen(inorder)-1);//边界!!,否则递归会出错的
         //   printf("root=%d  %c
    ",root,root+'A');
            //后序遍历
            //for(int i=0;i<30;i++) printf("left[%d]=%d , right[%d]=%d
    ",i,left[i],i,right[i]);
            postra(root);
            printf("
    ");
    
        }
    
    return 0;
    }

    注意事项:

    1、初始递归边界strlen()-1;

    2、用-1表示空,因为0表示‘A’

    3、memset只能初始化为0或者-1

    4、正确的递归关系

    [(L1),L1+1,L1+len,L1+1+len,R1]

    [L2,p-1,(p),p+1,R2]

  • 相关阅读:
    Dubbo基础知识
    mongodb 备份还原
    如何快速同步hdfs数据到ck
    sed 删除命令
    Host key verification failed 问题解决
    es boolquery 的几种用法
    ck中如何查询同比环比
    mysql 触发器介绍
    clickhouse 批量删除分区
    kafka 数据清除机制
  • 原文地址:https://www.cnblogs.com/debug-the-heart/p/12592566.html
Copyright © 2020-2023  润新知