3 条题解

  • 1
    @ 2026-6-11 20:25:52
    #include <bits/stdc++.h>
    using namespace std;
    const int N=1e5+9;
    string a,b,c;
    void solved(string in,string post,string &pre) {
    	if(in.empty()) return ;
    	char root = post[post.size()-1];
    	pre+=root;
    	int pos=in.find(root);
    	solved(in.substr(0,pos),post.substr(0,pos),pre);
    	solved(in.substr(pos+1),post.substr(pos,post.size()-pos-1),pre);
    }
    int main(){
    	cin >>a>>b;
    	solved(a,b,c);
    	cout <<c;
    return 0;
    }
    
    • 1
      @ 2026-2-14 10:42:55

      91、求先序排列(广赋张老师的题解)

      #include<bits/stdc++.h>
      using namespace std;
      
      // 中序字符串和后序字符串(全局变量,方便所有函数使用)
      string zhong, hou;
      
      /**
       * 递归函数:根据中序和后序遍历,构建并返回先序遍历字符串
       * zhongL 当前子树在中序字符串中的左边界(下标)
       * zhongR 当前子树在中序字符串中的右边界(下标)
       * houL   当前子树在后序字符串中的左边界(下标)
       * houR   当前子树在后序字符串中的右边界(下标)
       * return 返回当前子树的先序遍历字符串
       */
      string tree(int zhongL, int zhongR, int houL, int houR) {
          // 如果左边界 > 右边界,说明这个区间是空的(没有节点)
          if (zhongL > zhongR)
              return "";  // 返回空字符串
          
          // 后序遍历的最后一个节点,就是当前子树的根节点
          char root = hou[houR];
          
          // 在中序遍历中找到根节点的位置
          // 根节点左边是左子树的中序遍历,右边是右子树的中序遍历
          int pos = zhong.find(root);
          
          // 计算左子树的长度(节点个数)
          // 左子树的中序遍历是从 zhongL 到 pos-1
          int leftLen = pos - zhongL;
          
          // 先序遍历 = 根 + 左子树的先序 + 右子树的先序
          return root 
                 // 递归处理左子树
                 // 左子树的中序范围:[zhongL, pos-1]
                 // 左子树的后序范围:[houL, houL + leftLen - 1]
                 + tree(zhongL, pos - 1, houL, houL + leftLen - 1)
                 // 递归处理右子树
                 // 右子树的中序范围:[pos+1, zhongR]
                 // 右子树的后序范围:[houL + leftLen, houR - 1]
                 + tree(pos + 1, zhongR, houL + leftLen, houR - 1);
      }
      
      int main() {
          // 输入中序和后序遍历字符串
          cin >> zhong >> hou;
          
          // 调用递归函数,从整棵树开始(范围是整个字符串)
          // 字符串下标从0开始,所以右边界是 size()-1
          cout << tree(0, zhong.size() - 1, 0, hou.size() - 1);
          
          return 0;
      }
      
      • 0
        @ 2026-2-19 11:36:31
        #include <iostream>
        #include <string>
        using namespace std;
        
        string zhong, hou;
        
        string xianxu(string zhong, string hou) {
        
            if (zhong.empty()) return "";
        
          
            string root = hou.substr(hou.size() - 1);
            int a = zhong.find(root);
            string zhongLeft = zhong.substr(0,a);
            string zhongRight = zhong.substr(a + 1);
            string houLeft = hou.substr(0,zhongLeft.size());
            string houRight = hou.substr(houLeft.size(),zhongRight.size());
        
            return root + xianxu(zhongLeft,houLeft) + xianxu(zhongRight,houRight); 
        }
        
        int main() {
            cin>>zhong>>hou;
            cout<<xianxu(zhong,hou);
            
            return 0;
        }
        
        • 1

        信息

        ID
        91
        时间
        1000ms
        内存
        256MiB
        难度
        3
        标签
        递交数
        121
        已通过
        18
        上传者