6.二叉树——2.重建树

已知先序和中序序列

  1. 根据先序序列找到树根
  2. 根据树根和中序序列找到左右子树

同理根据后序序列和中序序列也能重构树,但前序和后序不可以

递归coding思路

设先序序列为preorder[n],中序序列为midorder[n]

  1. 大事化小:
    • 确定根,即树根为preorder[0],左子树为preorder[1~ pos],右子树为preorder[pos+1~ n]
    • 找到根,即查询到根在中序序列中的位置为pos,有midorder[0~ (pos-1)]是左子树,midorder[ (pos+1)~n]是右子树
  2. 最小问题:子树序列长度为0——>表明是空树

例题

在这里插入图片描述

代码

#include <cstdio>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
using namespace std;

struct TreeNode{
    char data;
    TreeNode * leftChild;
    TreeNode * rightChild;
};
struct QueueNode{
    TreeNode *parent;
    bool isLeftIn;
};

void aftOrder(TreeNode* root){
    if (root==NULL){
        return;
    }
    aftOrder(root->leftChild);
    aftOrder(root->rightChild);
    printf("%c",root->data);
}
TreeNode * rebuild(string preOrder,string midOrder){
    //rebuild返回根节点地址
    if (preOrder.size()==0){
        return NULL;
    } else{
        //根据先序序列确定根
        char root_data = preOrder[0];
        TreeNode *new_node = new TreeNode;
        new_node->data = root_data;
        //用根切割中序序列
        int pos = midOrder.find(root_data);
        string left_pre = preOrder.substr(1,pos);//对先序序列切割,取从下标1开始,长度为pos的左子树串
        string right_pre= preOrder.substr(pos+1);//对先序序列切割,取右子树序列(先序)
        string left_mid = midOrder.substr(0,pos);
        string right_mid= midOrder.substr(pos+1);
        new_node->leftChild = rebuild(left_pre,left_mid);
        new_node->rightChild = rebuild(right_pre,right_mid);

        return new_node;
    }
}

int main() {
    char preOrder[100];
    char midOrder[100];
    while(scanf("%s%s",preOrder,midOrder)!=EOF){
        TreeNode * root = rebuild(preOrder,midOrder);
        aftOrder(root);
        printf("\n");
    }
    return 0;
}

已知带空树提醒的先序序列

输入一个字符串,即树的先序序列,空叶部分用#填补。

递归coding思路

  1. 大事化小:
    • 读取第一个非#字符:树的根
    • 接下来的非#字符:左子树根
    • 再接下来的非#字符:右子树根
  2. 最小问题:读取到#,表明是空树,需要往回走了

代码

#include <cstdio>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
using namespace std;

struct TreeNode{
    char data;
    TreeNode * leftChild;
    TreeNode * rightChild;
};
struct QueueNode{
    TreeNode *parent;
    bool isLeftIn;
};

void midOrder(TreeNode* root){
    if (root==NULL){
        return;
    }
    midOrder(root->leftChild);
    printf("%c ",root->data);
    midOrder(root->rightChild);
}

TreeNode * rebuild(string preOrder,string midOrder){
    //rebuild返回根节点地址
    if (preOrder.size()==0){
        return NULL;
    } else{
        //根据先序序列确定根
        char root_data = preOrder[0];
        TreeNode *new_node = new TreeNode;
        new_node->data = root_data;
        //用根切割中序序列
        int pos = midOrder.find(root_data);
        string left_pre = preOrder.substr(1,pos);//对先序序列切割,取从下标1开始,长度为pos的左子树串
        string right_pre= preOrder.substr(pos+1);//对先序序列切割,取右子树序列(先序)
        string left_mid = midOrder.substr(0,pos);
        string right_mid= midOrder.substr(pos+1);
        new_node->leftChild = rebuild(left_pre,left_mid);
        new_node->rightChild = rebuild(right_pre,right_mid);

        return new_node;
    }
}

TreeNode * pre_build(int &i,string attached_preorder){
    char c = attached_preorder[i];
    ++i;
    if (c =='#'){
        return NULL;
    } else{
        TreeNode * new_node = new TreeNode;
        new_node->data = c;
        new_node->leftChild = pre_build(i,attached_preorder);
        new_node->rightChild = pre_build(i,attached_preorder);
        return new_node;
    }
}

int main() {
    char str[1000];
    scanf("%s",str);
    int i = 0;
    TreeNode * root = pre_build(i,str);
    midOrder(root);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/494531.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Chrome 插件 storage API 解析

Chrome.storage API 解析 使用 chrome.storage API 存储、检索和跟踪用户数据的更改 一、各模块中的 chrome.storage 内容 1. Service worker 中 runtime 内容 2. Action 中 runtime 内容 3. Content 中 runtime 内容 二、权限&#xff08;Permissions&#xff09; 如果需使…

Ubuntu 配置 kubernetes 学习环境,让外部访问 dashboard

Ubuntu 配置 kubernetes 学习环境 一、安装 1. minikube 首先下载一下 minikube&#xff0c;这是一个单机版的 k8s&#xff0c;只需要有容器环境就可以轻松启动和学习 k8s。 首先你需要有Docker、QEMU、Hyperkit等其中之一的容器环境&#xff0c;以下使用 docker 进行。 对…

CleanMyMac X2024专业免费的国产Mac笔记本清理软件

非常高兴有机会向大家介绍CleanMyMac X 2024这款专业的Mac清理软件。它以其强大的清理能力、系统优化效果、出色的用户体验以及高度的安全性&#xff0c;在Mac清理软件市场中独树一帜。 CleanMyMac X2024全新版下载如下: https://wm.makeding.com/iclk/?zoneid49983 一、主要…

Nuxt2 渲染时html比css加载快,导致闪屏/CSS样式迟滞/抖动问题记录

问题场景&#xff1a; 最近在用Nuxt2重写公司官网&#xff0c;但因为笔者不是专业前端&#xff0c;之前虽然也用vue2来写前端&#xff0c;但是用nuxt2来写项目还是第一次。在开发过程中虽然也磕磕碰碰&#xff0c;但因为开发的是官网&#xff0c;偏CMS型的网站&#xff0c;所以…

Wireshark使用相关

1.wireshark如何查看RST包 tcp.flags.reset1 RST表示复位&#xff0c;用来异常的关闭连接&#xff0c;在TCP的设计中它是不可或缺的。发送RST包关闭连接时&#xff0c;不必等缓冲区的包都发出去&#xff08;不像上面的FIN包&#xff09;&#xff0c;直接就丢弃缓存区的包发送R…

安科瑞路灯安全用电云平台解决方案【电不起火、电不伤人】

背景介绍 近年来 &#xff0c;随着城市规模的不断扩大 &#xff0c;路灯事业蓬勃发展。但有的地方因为观念、技术、管理等方面不完善 &#xff0c;由此引发了一系列安全问题。路灯点多面广 &#xff0c;一旦漏电就极容易造成严重的人身安全事故。不仅给受害者家庭带来痛苦 &am…

亚信安全荣获2023年度5G创新应用评优活动两项大奖

近日&#xff0c;“关于2023 年度5G 创新应用评优活动评选结果”正式公布&#xff0c;亚信安全凭借在5G安全领域的深厚积累和创新实践&#xff0c;成功荣获“5G技术创新的优秀代表”和“5G应用创新的杰出实践”两项大奖。 面向异构安全能力的5G安全自动化响应系统 作为5G技术创…

架构师之路--Docker的技术学习路径

Docker 的技术学习路径 一、引言 Docker 是一个开源的应用容器引擎&#xff0c;它可以让开发者将应用程序及其依赖包打包成一个可移植的容器&#xff0c;然后在任何支持 Docker 的操作系统上运行。Docker 具有轻量级、快速部署、可移植性强等优点&#xff0c;因此在现代软件开…

软件接口安全设计规范及审计要点

1.token授权安全设计 2.https传输加密 3.接口调用安全设计 4.日志审计里监控 5.开发测试环境隔离&#xff0c;脱敏处理 6.数据库运维监控审计 项目管理全套资料获取&#xff1a;软件开发全套资料_数字中台建设指南-CSDN博客

自营商城私域商城的选品上货如何借助API实现自动化商品采集商品搜索无货源?

商业智能时代的来临&#xff0c;在线化、网络化、智能化、企业与用户的颗粒度越来越细&#xff0c;满足每个人的个性化要求也是未来商业的重要特征&#xff01;马云曾经说过&#xff0c;未来的核心资源是数据&#xff0c;数据将成为一家企业动力源&#xff0c;而这一切的基础都…

neo4j相同查询语句一次查询特慢再次查询比较快。

现象&#xff1a; neo4j相同查询语句一次查询特慢再次查询比较快。 分析&#xff1a; 查询语句 //查询同名方法match(path:Method) where id(path) in [244333030] and NOT path:Constructor//是rpc的方法match(rpc_method:Method)<-[:DECLARES]-(rpc_method_cls:Class) -…

ensp配置acl高级配置访问控制列表

拓扑结构 资源已上传 acl访问控制列表 简单配置&#xff1a;控制目的ip地址 高级配置&#xff1a;源ip地址&#xff0c;目的ip地址等。 要求&#xff1a;拓扑三个vlan 10&#xff0c;20&#xff0c;30&#xff0c;通过设置acl使10网段可以访问20网段&#xff0c;但是不可以…

comfyui 代码结构分析

comfyui的服务器端是用aiohtttp写的&#xff0c;webui是fastapi直接构建的&#xff0c;但是其实comfyui的这种设计思路是很好的&#xff0c;也许我们不需要在后端起一个复杂的前台&#xff0c;但是可以借助json结构化pipeline&#xff0c;然后利用node节点流把整个流程重新映射…

在 Linux CentOS 中安装 Docker Engine(Dockers 引擎)【图文详解】

官方文档&#xff1a;https://docs.docker.com/engine/install/centos/ 操作系统要求 如果我们要在 CentOS 中安装 Docker 引擎&#xff0c;那么 CentOS 操作系统需要是以下版本之一的&#xff0c;且是处于维护的 CentOS 版本&#xff1a; CentOS 7CentOS Stream 8CentOS Str…

策略路由-IP-Link-路由协议简介

策略路由 策略路由和路由策略的不同 1.策略路由的操作对象是数据包&#xff0c;在路由表已经产生的情况下&#xff0c;不按照路由表进行转发&#xff0c;而是根据需要&#xff0c;依照某种策略改变数据包的转发路径 2.路由策略的操作对象是路由信息。路由策略的主要实现了路…

Self-Consistency Improves Chain of Thought Reasoning in Language Models阅读笔记

论文链接&#xff1a;https://arxiv.org/pdf/2203.11171.pdf 又到了读论文的时间&#xff0c;内心有点疲惫。这几天还是在看CoT的文章&#xff0c;今天这篇是讲如何利用self-consistency&#xff08;自我一致性&#xff09;来改进大语言模型的思维链推理过程。什么是self-cons…

快速上手Spring Cloud 十一:微服务架构下的安全与权限管理

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …

矢量(向量)数据库

矢量(向量)数据库 什么是矢量数据库&#xff1f; 在人工智能领域&#xff0c;大量的数据需要有效的分析和处理。随着我们深入研究更高级的人工智能应用&#xff0c;如图像识别、语音搜索或推荐引擎&#xff0c;数据的性质变得更加复杂。这就是矢量数据库发挥作用的地方。与存…

docker中安装mysql8

阿里云ecs服务器&#xff0c;centos7.9系统&#xff0c;docker中安装mysql8 文章目录 阿里云ecs服务器&#xff0c;centos7.9系统&#xff0c;docker中安装mysql81. 拉取镜像2. 基于宿主机实现mysql8数据目录、配置文件、初始化脚本的挂载2.1 创建3个文件夹&#xff0c;一会创建…

2.2 添加商户缓存

实战篇Redis 2.2 添加商户缓存 在我们查询商户信息时&#xff0c;我们是直接操作从数据库中去进行查询的&#xff0c;大致逻辑是这样&#xff0c;直接查询数据库那肯定慢咯&#xff0c;所以我们需要增加缓存 GetMapping("/{id}") public Result queryShopById(Pat…