二叉树序列相关算法题|先序序列第k节点|满二叉树先序序列转后序序列(C)

先序序列第k节点的值

假设二叉树采用二叉链存储结构存储,设计一个算法,求先序遍历序列中第k(1<=k<=二叉树中的节点个数)个节点的值

算法思想

设置一个全局遍历i(初值为1)来表示进行先序遍历时,当前访问的是第几个节点。然后可以借用先序遍历的代码模型,先序遍历二叉树。
当二叉树root为空时,返回特殊字符‘#’;当k == i时,该节点即为要找的节点,返回root->data;当k != i时。递归地在左子树中查找,若找到则返回该值,否则继续递归地在右子树中查找,并返回其结果。

  • 先序遍历的顺序为:
    • 访问根节点;
    • 遍历左子树;
    • 遍历右子树。
  • 使用全局变量 i 记录当前访问的节点是第几个。
  • 如果访问到的节点的序号等于 k,则返回该节点的值。
  • 如果当前节点不是 k,则继续递归查找左子树和右子树。
  • 若查找结束仍未找到,则返回一个特殊字符 ‘#’,表示不存在第 k 个节点。
// 遍历序号的全局变量
int i = 1;
// 查找二叉树先序遍历序列中第k个节点的值
ElemType PreNode(BTNode root, int k)
{// 空节点,则返回特殊字符if (root == NULL)return '#';// 相等,则当前节点即为第k个节点if (i == k)return root->data;// 下一个节点i++;// 左子树中递归查找ch = PreNode(root->left, k);// 在左子树中,则返回该值if (ch != '#')return ch;// 在右子树中查找ch = PreNode(root->right, k);return ch;
}

如果遇到空节点,返回#,表示没有找到k节点,如果找到k节点,返回data值
如果在左子树找到k节点,直接返回,不用去右子树找

满二叉树先序序列确定后序序列

设有一棵满二叉树(所有节点值均不相同),已知其先序序列为pre,设计一个算法求其后序序列post

算法思想

对一般二叉树,仅根据先序或后序序列,不能确定另一个遍历序列。但对满二叉树,任意一个节点的左右子树均含有相等的节点数,同时,先序序列的第一个节点作为后序序列的最后一个节点,由此得到将先序序列pre[l1, ..., h1]转换为后序序列post[l2, ..., h2]的递归模型
h1小于l1时,f(pre, l1, h1, post, l2, h2) 不做任何事情
其他情况,f(pre, l1, h1, post, l2, h2) = post[h2] = pre[11]
取中间位置half = (h1 - l1)/2
pre[l1+1, l1+half]左子树转换为post[l2, l2 + half - 1]
f(pre, l1+ 1, l1+ half, post, l2, l2+half - 1)
pre[l1 + half + 1, h1]右子树转换为post[l2+ half, h2-1]
f(pre, l1+half + 1, h1, post, 12+half, h2-1)
其中,post[h2] = pre[11]表示后序序列的最后一个节点(根节点)等于先序序列的第一个节点
![[Pasted image 20241212133542.png]]

先序:ABDEC
后序:DEBCA

初始调用

传入pre,0,4,post,0,4
0-4表示完整的先序和后序序列的下标区间
![[Pasted image 20241212213521.png]]

处理根节点
  1. 当前递归处理的根节点
    将prel1的A放入后序的最后一个位置posth2
    ![[Pasted image 20241212214206.png]]

  2. 计算half
    half=(h1 - l1) / 2 = (4 - 0) / 2 = 2
    左子树节点数为half = 2
    子树区间划分:
    先序左子树:pre1-2
    先序右子树:pre3-4
    后序左子树:post0-1
    后序右子树:post2-3
    ![[Pasted image 20241212215145.png]]

  3. 递归调用左右子树

PreToPost(pre, l1 + 1, l1 + half, post, l2, l2 + half - 1); // 左子树
PreToPost(pre, l1 + half + 1, h1, post, l2 + half, h2 - 1); // 右子树

l1 + 1 = 0 + 1 = 1;l1 + half = 0 + 2 = 2;l2 = 0;l2 + half - 1 = 1
l1 + half + 1 = 0 + 2 + 1 = 3;h1 = 4;l2 + half = 0 + 2 = 2;h2 - 1 = 3;

处理左子树

传入pre,1,3,post,0,2
![[Pasted image 20241212220509.png]]

  1. 当前递归处理的根节点
    prel1 = B,把B放入后序的最后一个位置posth2
    ![[Pasted image 20241212221236.png]]

  2. 计算half
    half = (h1 - l1) / 2 = (3 - 1) / 2 = 1;
    左子树节点数为 half = 1。
    子树区间划分:
    左子树(先序):pre2-2
    右子树(先序):pre3-3
    左子树(后序):post0-0
    右子树(后序):post1-1
    ![[Pasted image 20241212222122.png]]

  3. 递归调用左右子树

PreToPost(pre, 2, 2, post, 0, 0); // 左子树
PreToPost(pre, 3, 3, post, 1, 1); // 右子树
处理左子树的左子树

传入pre,2,2,post,0,0

  1. prel1 = D,将D放入posth2
    ![[Pasted image 20241212222359.png]]

  2. 区间检查,左右子树都为空,递归结束

处理左子树的右子树

传入pre。3,3,post,1,1

  1. prel1 = E,将E放入posth2
    ![[Pasted image 20241212224742.png]]
处理右子树

传入pre,4,4,post,2,3

  1. 当前递归处理的根节点
    prel1=C,将C放入posth2
    ![[Pasted image 20241212230715.png]]

  2. 区域检查
    左子树和右子树均为空,递归结束

void PreToPost(ElemType pre[], int l1, int h1, ElemType post[], int l2, int h2)
{// 子树大小的一半int half;// 确保先序区间有效if(h1 >= l1){// 根节点在后序数组中的位置post[h2] = pre[l1];// 左子树的大小half = (h1 - l1) / 2;// 递归处理左子树PreToPost(pre, l1+1, l1+half, post, l2, l2+half-1);// 递归处理右子树PreToPost(pre, l1+half+1, h1, post, l2+half, h2-1);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hyperbolic Representation Learning: Revisiting and Advancing 论文阅读

Hyperbolic Representation Learning: Revisiting and Advancing 论文地址和代码地址1 介绍2 背景知识2.1 黎曼几何与双曲空间(RiemannianGeometry and Hyperbolic Space)2.2 双曲浅层模型2.3 双曲神经网络&#xff08;HNNs&#xff09;2.4 双曲图卷积神经网络&#xff08;HGCN…

牛客刷题(总结)

目录 <1> <2> 思路 <1> 给你 4 个整数 a,b,c,d&#xff0c;你需要回答 是奇数还是偶数。 #include<stdio.h> #define int long long int f(int a) {if(a%20){return 0;}else{return 1;}} signed main() {int a,b,c,d;scanf("%lld %lld %lld %ll…

阿里云服务器Linux(centos)系统安装nginx1.20.2

阿里云服务器Linux(centos)系统安装nginx1.20.2 1.安装依赖包 一共要安装4种依赖&#xff08;基于c语言&#xff09; yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel2.下载nginx安装包并解压安装包 nginx官网下载&#xff1a;http://nginx.org/en/do…

谷粒商城—分布式高级①.md

1. ELASTICSEARCH 1、安装elastic search dokcer中安装elastic search (1)下载ealastic search和kibana docker pull elasticsearch:7.6.2 docker pull kibana:7.6.2(2)配置 mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/data echo "h…

【大语言模型LangChain】 ModelsIO OutputParsers详解

【大语言模型LangChain】 ModelsIO OutputParsers详解 一、简介二、OutputParsers 的优势三、解析器类型四、实战示例1、String 解析器2、Json 解析器3、Pydantic 解析器4、结构化输出解析器5、OpenAI 函数输出解析器5.1、JsonOutputFunctionsParser5.2、JsonKeyOutputFunction…

支持自定义离线地图地理区域,查询组件及数据源功能增强,DataEase开源BI工具v2.10.3 LTS发布

2024年12月9日&#xff0c;人人可用的开源BI工具DataEase正式发布v2.10.3 LTS版本。 这一版本的功能变动包括&#xff1a;数据源方面&#xff0c;API数据源和Excel数据源支持对字段类型和长度进行设置&#xff1b;图表方面&#xff0c;离线类地图支持自定义地理区域设置&#…

Vite 打包构建的产物

当我们谈到现代前端工具时&#xff0c;Vite 是一个不可忽视的名字。它以极快的开发速度和高效的生产构建而闻名。不知道朋友们有没有跟我有一样好奇&#xff0c;当 Vite 将你的代码打包时&#xff0c;它究竟会生成什么样的文件&#xff1f;又是如何智能地找到入口文件和资源文件…

【JVM】JVM基础教程(四)

上一章&#xff1a;【JVM】JVM基础教程&#xff08;三&#xff09;-CSDN博客 目录 自动垃圾回收 方法区的回收 方法区回收条件 手动触发回收 堆回收 如何判断堆上的对象可以回收&#xff1f; 可以给对象引用赋值null&#xff0c;切断引用 引用计数法 循环引用缺点 查…

rabbitMq的rabbitmqctl status报错

Error: unable to perform an operation on node rabbitASUS-PC. Please see diagnostics information and suggestions below. 遇到上图这个错大部分问题可能是由于 RabbitMQ CLI 工具的 Erlang Cookie 与服务器上的不匹配而导致连接问题。Erlang Cookie 在 RabbitMQ 节点之间…

解读数据资产管理实践白皮书(5.0版)深入学习掌握数据资产管理知识体系。

本文介绍了数据资产管理的重要性及其概述&#xff0c;详细阐述了数据资产管理的活动职能包括数据模型管理、数据标准管理、数据质量管理等&#xff0c;并强调了数据安全管理的重要性。文章还讨论了数据资产管理的保障措施和实践步骤&#xff0c;以及发展趋势和总结展望。 重点内…

玩《剑灵》提示d3dx9_43.dll缺失怎么解决?找不到d3dx9_43.dll文件是什么原因?

《剑灵》d3dx9_43.dll缺失解决方案 在畅游《剑灵》这款深受玩家喜爱的游戏时&#xff0c;有时可能会遇到一些令人头疼的问题&#xff0c;比如提示“d3dx9_43.dll缺失”。这个错误不仅让游戏无法正常启动&#xff0c;还可能让玩家对游戏体验产生挫败感。作为一名软件开发从业者…

linux网络编程 | c | select实现多路IO转接服务器

select实现多路IO转接服务器 基于该视频完成 15-select实现多路IO转接设计思路_哔哩哔哩_bilibili 通过响应式–多路IO转接实现 文章目录 select实现多路IO转接服务器1.思路&功能2.代码实现warp.hwarp.cmulti_select_sever.c运行图 3.代码解释&#xff08;细节&#xf…

【有啥问啥】大语言模型Prompt中的“System指令”:深入剖析与误区澄清

大语言模型Prompt中的“System指令”&#xff1a;深入剖析与误区澄清 引言 在与大语言模型&#xff08;LLM&#xff09;交互时&#xff0c;“prompt”&#xff08;提示符&#xff09;这一概念已不再陌生。Prompt是引导模型生成特定类型文本的关键输入&#xff0c;决定了模型的…

【大模型】ChatGPT 创作各类高质量文案使用详解

目录 一、前言 二、ChatGPT文案创作的优势 三、ChatGPT 各类文案创作操作实战 3.1 ChatGPT创作产品文案 3.1.1 ChatGPT创作产品文案基本思路 3.1.2 ChatGPT 创作产品文案案例一 3.1.2.1 操作过程 3.1.3 ChatGPT 创作产品文案案例二 3.2 ChatGPT 创作视频脚本 3.2.1 Ch…

前端自己也能开启HTTPS

目录 前言 使用mkcert 安装 创建证书 利用 mkcert 创建 ca 根据 ca 创建 cert 安装证书 项目开启HTTPS 安装插件 配置 vitecofnig.js 最终效果 前言 今天我发现了一个宝藏&#xff0c;兄弟们&#xff01;就是前端开发阶段是可以使用https来开发的。对不懂前端的后端兄…

预言机调研

预言机 1. 概述 预言机主要承担两个工作&#xff0c;一是验证信息可靠性&#xff0c;二是传递信息。 如果没有预言机&#xff0c;区块链的信息来源将仅限于其内部数据&#xff0c;其广泛使用的潜力和可能性将会大大降低。 区块链预言机是区块链与外部世界之间的桥梁。它们使区…

Geometric Estimation via Robust Subspace Recovery_译文ECCV2020

目录 摘要&#xff1a; 1 引言 2 相关工作 3 方法 3.1 DLT 简介 3.2 鲁棒泛化 3.3 线性结构的扩展探索 3.4 实现细节 4 实验结果 4.1 线性嵌入的定性分析 4.2 基本和单应性估计 4.3 对离群值率的敏感性 5 结论 摘要&#xff1a; 根据图像点对应关系进行几何估计是许多 …

Linux入门攻坚——41、Linux集群系统入门-lvs(2)

lvs-dr&#xff1a;GATEWAY Director只负责请求报文&#xff0c;响应报文不经过Director&#xff0c;直接由RS返回给Client。 lvs-dr的报文路线如上图&#xff0c;基本思路就是报文不会回送Director&#xff0c;第①种情况是VIP、DIP、RIP位于同一个网段&#xff0c;这样&…

中粮凤凰里共有产权看房记

中粮凤凰里看房是希望而来&#xff0c;失望而归。主要是对如下失望&#xff0c;下述仅个人看房感受&#xff1a; 1. 户型不喜欢&#xff1a;三房的厨房和餐厅位置很奇葩 2. 样板间在25楼&#xff1a;湖景一言难尽和有工厂噪声 3. 精装修的交房质量:阳台的推拉门用料很草率 …

信奥赛CSP-J复赛集训(bfs专题)(5):洛谷P3395:路障

信奥赛CSP-J复赛集训&#xff08;bfs专题-刷题题单及题解&#xff09;&#xff08;5&#xff09;&#xff1a;洛谷P3395&#xff1a;路障 题目描述 B 君站在一个 n n n\times n nn 的棋盘上。最开始&#xff0c;B君站在 ( 1 , 1 ) (1,1) (1,1) 这个点&#xff0c;他要走到 …