zoukankan      html  css  js  c++  java
  • 洛谷 P1030 求先序排列

    这道题中,有几个可以确定的信息

    1.后序排列的最后一个元素必然是这个树的主根节点

    2.我们在输出的时候,可以只需要输出访问的父节点即可,那么就只需要把一个树不断地分为两个子树,然后找到他们的父节点,不断地递归输出

    那么,我们可以在中序遍历找到父节点之后,计算出他的左子树和右子树的节点数量。

    然后,由于我们对结点的访问一定是先访问一颗子树,在访问另一颗,所以在我们的原后序遍历串右边界中减掉右子树节点个数再减一即为新的左子树右边界,在原后序遍

    历串左边界加上左子树节点个数即为新的右子树左边界;

    代码

    #include<iostream>

    #include<cstdio>

    #include<algorithm>
    #include<cstring>
    #include<math.h>
    using namespace std;
    
    char s1[1000];
    char s2[1000];
    int len;
    
    int find(char ch)
    {
        for(int i=0;i<len;i++)
        {
            if(s1[i]==ch)
            {
                return i;
            }
        }
    }
    
    void dfs(int l1,int r1,int l2,int r2)//l1为左子树起点,r1为右子树起点,l2为左子树边界,r2为右子树边界
    {
    int m=find(s2[r2]); cout<<s2[r2]; if(m>l1)//有左子树 dfs(l1,m-1,l2,r2-r1+m-1);//r1-m为右子树节点数 if(m<r1)//有右子树 dfs(m+1,r1,l2+m-l1,r2-1);//m-l1为左子树节点数 } int main(void) { cin>>s1; cin>>s2; len=strlen(s1); dfs(0,len-1,0,len-1); return 0; }
  • 相关阅读:
    函数
    拉取代码到本地
    逻辑位运算符 以及 布尔运算符&&、||
    JS中substr与substring的区别
    ? :和!:的用法含义及es6语法...
    JS中attribute和property的区别
    并发、并行的理解
    斑鸠云商小程序记住账号和密码
    js中的foreach用法
    指针与数组
  • 原文地址:https://www.cnblogs.com/jd1412/p/12767751.html
Copyright © 2011-2022 走看看