首页 > 其他分享 >Uva--548 Tree(三个递归遍历/重建二叉树)

Uva--548 Tree(三个递归遍历/重建二叉树)

时间:2023-05-18 23:33:49浏览次数:44  
标签:遍历 -- MAX Tree int 二叉树 l1 ind

记录
23:13 2023-5-18

uva.onlinejudge.org/external/5/548.html

reference:《算法竞赛入门经典第二版》例题6-8

使用中序遍历和后序遍历还原二叉树,还行,还是熟悉的。
收获的点:

  1. 使用数组快速建立二叉树(还是要变通,《数据结构与算法分析》中标准的使用了结构体指针,太过学术了?
  2. 函数中参数作为中间变量传递,这样就可以不用修改了,栈退去后值也相当于回来了(下面preorder1和preorder的区别)(这个我居然忘了。。。
#include<cstdio>
#include<iostream>
#include<sstream>
#define MAX_N 10000
using namespace std;
typedef long long ll;
typedef unsigned int uint;
const int INF = 0x3f3f3f3f;

int ind = 0;
int inorder[MAX_N + 1], postorder[MAX_N + 1], le[MAX_N + 1], ri[MAX_N + 1];
int sum = INF;
int temp = 0;
int result = 0;

bool read_list(int* a) {
  string line;
  if(!getline(cin, line)) return false;
  stringstream ss(line);
  ind = 0;
  int x;
  while(ss >> x) a[ind++] = x;
  return ind > 0;
}

// inorder [l1 r1]
// postorder [l2 r2]
int build_tree(int l1, int r1, int l2, int r2) {
    if(l1 > r1) return 0;
    int root = postorder[r2];
    for(int i = l1; i <= r1; i++) {
        if(root == inorder[i]) {
            int l = build_tree(l1, i - 1, l2, l2 + i - 1 - l1);
            int r = build_tree(i + 1, r1, l2 + i - l1, r2 - 1);
            le[root] = l;
            ri[root] = r;
            break;
        }
    }
    return root;
}

void preorder(int root) {
    temp += root;
    if(le[root] == 0 && ri[root] == 0) {
        if(temp < sum || (temp == sum && root < result)) {
            sum = temp;
            result = root;
        }
        temp -= root;
        return;
    }
    if(le[root]) {
        preorder(le[root]);
    }
    if(ri[root]) { 
        preorder(ri[root]);
    }
    temp -= root;
}

void preorder1(int root, int temp) {
    temp += root;
    if(le[root] == 0 && ri[root] == 0) {
        if(temp < sum || (temp == sum && root < result)) {
            sum = temp;
            result = root;
        }
        return;
    }
    if(le[root]) {
        preorder1(le[root], temp);
    }
    if(ri[root]) { 
        preorder1(ri[root], temp);
    }
}

void solve() {
    sum = INF;
    temp = 0;
    result = 0;
    build_tree(0, ind-1, 0, ind-1);
    preorder1(postorder[ind-1], 0);
    printf("%d\n", result);
}

int main() {
    while (read_list(inorder)) {
        read_list(postorder);
        solve();
    }
    return 0;
}

标签:遍历,--,MAX,Tree,int,二叉树,l1,ind
From: https://www.cnblogs.com/57one/p/17413607.html

相关文章

  • P5540 [BalkanOI2011] timeismoney | 最小乘积生成树
    题意给一个无向图,边有两个权\(a\)和\(b\),定义一个生成树的权值是\(\left(\sum\limits_{e\inT}a_e\right)\left(\sum\limits_{e\inT}b_e\right)\),求最小权值生成树。权值相同请最小化\(a\)的和。\(1\len\le200,1\lem\le10000,0\lea_e,b_e\le255\)。题解纯粹记......
  • Java编程的逻辑
    chapter3类的基础3.3代码的组织机制包范围可见性如果什么修饰符都不写,它的可见性范围就是同一个包内,同一个包内的其他类可以访问,而其他包内的类则不可以访问。声明为protected不仅表明子类可以访问,还表明同一个包内的其他类可以访问,即使这些类不是子类也可以。总结来说,可......
  • MySQL双主复制原理
    MySQL双主复制(Master-MasterReplication)是一种基于MySQL异步复制(AsynchronousReplication)技术的高可用性方案。它的原理是将两台MySQL主服务器互相复制对方的数据,同时允许在两台服务器上进行读写操作,从而实现负载均衡和高可用性。具体来说,MySQL双主复制的原理如下:双主服务器......
  • docker安装nginx
    dockerpullregistry.cn-hangzhou.aliyuncs.com/ns-w/wh-w:nginx-1.22.0创建挂载目录mkdir-p/opt/resource/nginx/confmkdir-p/opt/resource/nginx/logmkdir-p/opt/resource/nginx/html生成容器dockerrun--namenginx-1.22.0-p80:80-dregistry.cn-hangzhou.aliy......
  • 详解c++STL—容器list
    1、list基本概念1.1、概念描述链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的链表的组成:链表由一系列结点组成功能:将数据进行链式存储1.2、结点的组成一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域STL中的链表是一......
  • es笔记五之term-level的查询操作
    本文首发于公众号:Hunter后端原文链接:es笔记五之term-level的查询操作官方文档上写的是term-levelqueries,表义为基于准确值的对文档的查询,可以理解为对keyword类型或者text类型分词为keyword的字段进行term形式的精确查找。以下是本篇笔记目录:是否存在值前缀搜索......
  • 五月学习之keepalived 综合实践
    1、需求案例业务场景在实际的工作中,我们的网站服务一般都是以域名的方式对外提供服务,对于这种情况下一般有这么两种现象:一个域名对应一个ip地址,万一域名解析的ip地址故障,就出现单点故障现象一个域名可以解析不同的后端服务,我们可以基于同域名解析多个不同服务的ip地址,更精确的响应......
  • #yyds干货盘点# LeetCode程序员面试金典: 二叉树的层序遍历 II
    1.简述:给你二叉树的根节点root,返回其节点值自底向上的层序遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 示例1:输入:root=[3,9,20,null,null,15,7]输出:[[15,7],[9,20],[3]]示例2:输入:root=[1]输出:[[1]]示例3:输入:root=[]输出:[]2.代码实现:classSolution......
  • 测试案例设计、故障模拟...非功能测试如何落地? 1
    随着数字化进程的高速发展,业务量随之增长,新架构下的IT系统的质量测试变得更加重要。针对新IT架构的设计逻辑,中电金信打造了源启数字构建平台,提供统一测试管理,构建了全面的质控体系,覆盖软件测试全生命周期。中电金信质量安全事业部非功能质量保障专家王瑀在Gien有料直播中向我们分享......
  • Golang高性能编程笔记--字符串拼接
    Golang中引入五种字符串拼接方法,分别如下:1.+拼接法2.fmt.Sprintf()3.strings.Builder4.bytes.Buffer5.[]byte代码示例,这里将根据《Go语言高性能编程》中的一节,来看一下这五种具体的方法:packagemainimport( "bytes" "fmt" "math/rand" "strings......