首页 > 其他分享 >二叉树给出先序和中序遍历序列,求和树 要求输出中序遍历序列;

二叉树给出先序和中序遍历序列,求和树 要求输出中序遍历序列;

时间:2023-12-24 15:45:15浏览次数:41  
标签:pre begin 遍历 int 中序 long 序列 define

1.就算不知道用vector的初始化,也可以手动赋值创建子数组。

2.不断找到当前序列对应的根节点,计算他的子节点的总和,在这样递归处理过程中,注意要中序输出,所以对于是先遍历完左子树,然后输出答案,然后遍历右子树

#include <bits/stdc++.h>
using namespace std;
#define ll long long
//# define int long long
#define ull unsigned long long
#define pii pair<int,int>

#define baoliu(x, y) cout << fixed << setprecision(y) << x
#define endl  "\n"
#define debug1(x) cerr<<"x"<<" "
#define  debug2(x) cerr<<"x"<<endl
const int N =1100;
const int M = 1e6 + 10;
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
const double eps = 1e-8;
int n, m;
vector<int>ans;
void dfs(vector<int>pre,vector<int>in){
	if(pre.size()==0)return ;
	int root=pre[0];
	int pos=find(in.begin(),in.end(),root)-in.begin();
	//cerr<<pos<<endl;
	int s=0;
	vector<int>b1,b2;
	for(int i=0;i<pos;i++){
		b1.push_back(in[i]);
		s+=in[i];
	}
	for(int i=pos+1;i<in.size();i++){
		b2.push_back(in[i]);
		s+=in[i];
	}
	vector<int>pre1(pre.begin()+1,pre.begin()+b1.size()+1);
	vector<int>pre2(pre.begin()+b1.size()+1,pre.end());
	dfs(pre1,b1);
	ans.push_back(s);
	dfs(pre2,b2);
}
void solve(){
	cin>>n;
	vector<int>pre(n),in(n);
	for(int i=0;i<n;i++)cin>>pre[i];
	for(int i=0;i<n;i++)cin>>in[i];
	dfs(pre,in);
		//for(int i=0;i<n;i++)cerr<<ans[i]<<endl;
	for(int i=0;i<n;i++)cout<<ans[i]<<" ";
}
int main() {
    cin.tie(0);
    
    ios::sync_with_stdio(false);

    int t;
   //cin>>t;
     t=1;
    while (t--) {
solve();
    }
    return 0;
}

标签:pre,begin,遍历,int,中序,long,序列,define
From: https://www.cnblogs.com/mathiter/p/17924433.html

相关文章

  • 二叉树已经知道先序中序推后序
    https://www.acwing.com/problem/content/3601/不断找新的先序的根节点,根据位置切割中序,根据中序左右子树大小反切割先序,找到左子树对应的先序中序,然后递归处理#include<stdio.h>#include<vector>#include<map>#include<algorithm>#include<algorithm>#include<iostream>......
  • 双指针算法-最长不重复子序列
    思路这里的i才是主要的遍历指针,j是用来剔除元素以满足题目要求的。代码#include<iostream>usingnamespacestd;constintN=1e5+10;intn,res;inta[N],s[N];intmain(){cin>>n;for(inti=0;i<n;i++)cin>>a[i];for(int......
  • C# .NET的BinaryFormatter、protobuf-net、Newtonsoft.Json以及自己写的序列化方法序
    https://www.cnblogs.com/s0611163/p/11872484.html测试结果整理后: 结论:1、这几个工具中,protobuf-net序列化和反序列化效率是最快的2、BinaryFormatter和Newtonsoft.Json反序列化慢的比较多3、Newtonsoft.Json序列化后的文件体积比较大4、Newtonsoft.Json在序列化反序列......
  • 7-3 最长公共子序列
    7-3最长公共子序列一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=<x1,x2,…,xm>,则另一序列Z=<z1,z2,…,zk>是X的子序列是指存在一个严格递增的下标序列<i1,i2,…,ik>,使得对于所有j=1,2,…,k有:Xij=Zj例如,序列Z=<B,C,D,B>是序列X=<A,B,C,B,D,A,B......
  • re | 通过PEB遍历进程模块
    re|通过PEB遍历进程模块最近在设计实验,重新写一些代码存一下:使用vc6编译通过。比较好的参考文章:https://www.cnblogs.com/bokernb/p/6404795.html#include<stdio.h>#include<windows.h>/*typedefstruct_LIST_ENTRY{struct_LIST_ENTRY*Flink;struct_LIST_......
  • 320二叉树的不同形态(已知层次遍历和中序遍历创建二叉树;输出叶子结点(从左到右);后序遍历)
    题目:二叉树的不同形态问题描述给定二叉树T(树深度H<=10,深度从1开始,结点个数N<1024,结点编号1~N)的层次遍历序列和中序遍历序列,输出T从左向右叶子结点以及二叉树先序和后序遍历序列。输入格式输入共三行:第一行是整数n,表示二叉树中的结点数目;第二行有n个整数,表示该二叉树的层次遍......
  • 318二叉树遍历
    1#include<stdio.h>2#include<string.h>3#include<stdlib.h>4typedefstructtreenode{5chardata;6structtreenode*lchild;7structtreenode*rchild;8}treenode,*tree;910treecreateTree(char*preorder,char......
  • 315二叉树扩展先序遍历转中序遍历
    题目:二叉树扩展先序遍历转中序遍历问题描述编一个程序,读入用户输入的一串扩展先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。例如如下的扩展先序遍历字符串:ABC##DE#G##F###其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出......
  • R语言经济学:动态模型平均(DMA)、动态模型选择(DMS)预测原油价格时间序列
    原文链接:http://tecdat.cn/?p=22458 原文出处:拓端数据部落公众号 简介本文提供了一个经济案例。着重于原油市场的例子。简要地提供了在经济学中使用模型平均和贝叶斯方法的论据,使用了动态模型平均法(DMA),并与ARIMA、TVP等方法进行比较。希望对经济和金融领域的从业人员和研究......
  • 429. N 叉树的层序遍历(中)
    目录题目题解:BFS题目给定一个N叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。树的序列化输入是用层序遍历,每组子节点都由null值分隔(参见示例)。题解:BFSclassSolution:deflevelOrder(self,root:'Node')->List[List[int]]:ifnotroot:......