当前位置: 首页 > news >正文

18724 二叉树的遍历运算

### 思路

1. **递归构建树**:
   - 先序遍历的第一个节点是根节点。
   - 在中序遍历中找到根节点的位置,左边部分是左子树,右边部分是右子树。
   - 递归构建左子树和右子树。

2. **递归生成后序遍历**:
   - 递归生成左子树的后序遍历。
   - 递归生成右子树的后序遍历。
   - 根节点放在最后。

### 伪代码

```
function buildTree(preorder, inorder):
    if preorder is empty:
        return null
    root = new TreeNode(preorder[0])
    rootIndex = find root in inorder
    root.left = buildTree(preorder[1:rootIndex+1], inorder[0:rootIndex])
    root.right = buildTree(preorder[rootIndex+1:], inorder[rootIndex+1:])
    return root

function postorderTraversal(root):
    if root is null:
        return ""
    left = postorderTraversal(root.left)
    right = postorderTraversal(root.right)
    return left + right + root.value

preorder = input()
inorder = input()
root = buildTree(preorder, inorder)
postorder = postorderTraversal(root)
print(postorder)
```

### C++代码

#include <iostream>
#include <string>using namespace std;struct TreeNode {char val;TreeNode* left;TreeNode* right;TreeNode(char x) : val(x), left(NULL), right(NULL) {}
};int findIndex(const string& str, char value, int start, int end) {for (int i = start; i <= end; ++i) {if (str[i] == value) {return i;}}return -1;
}TreeNode* buildTree(const string& preorder, int preStart, int preEnd, const string& inorder, int inStart, int inEnd) {if (preStart > preEnd || inStart > inEnd) return NULL;char rootVal = preorder[preStart];TreeNode* root = new TreeNode(rootVal);int inRoot = findIndex(inorder, rootVal, inStart, inEnd);int numsLeft = inRoot - inStart;root->left = buildTree(preorder, preStart + 1, preStart + numsLeft, inorder, inStart, inRoot - 1);root->right = buildTree(preorder, preStart + numsLeft + 1, preEnd, inorder, inRoot + 1, inEnd);return root;
}void postorderTraversal(TreeNode* root, string& postorder) {if (root == NULL) return;postorderTraversal(root->left, postorder);postorderTraversal(root->right, postorder);postorder += root->val;
}int main() {string preorder, inorder;cin >> preorder >> inorder;TreeNode* root = buildTree(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);string postorder;postorderTraversal(root, postorder);cout << postorder << endl;return 0;
}

相关文章:

  • Postgresql源码(136)syscache/relcache 缓存及失效机制
  • Debain docker容器离线安装ping命令
  • LIMS系统在设备管理中的核心价值
  • Windows下安装 LLama-Factory 保姆级教程
  • 学习C++的第七天!
  • C# 里,常用的数据类型转换说明,以及简单示例
  • 猫头虎带你解决:error Error: certificate has expired
  • 7.lambda表达式
  • g++的一些常用标识
  • 基于飞腾平台的OpenCV的编译与安装
  • linux网络编程9
  • 数据结构2——单链表
  • 【C++】类型转换
  • 人工智能开发实时语音识别系统应用
  • USB2.0主机设备检测过程以及信号分析
  • DOM的那些事
  • FastReport在线报表设计器工作原理
  • gulp 教程
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • NSTimer学习笔记
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • V4L2视频输入框架概述
  • 百度地图API标注+时间轴组件
  • 初探 Vue 生命周期和钩子函数
  • 开源地图数据可视化库——mapnik
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 线上 python http server profile 实践
  • 详解移动APP与web APP的区别
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 小程序开发之路(一)
  • 再谈express与koa的对比
  • ​2020 年大前端技术趋势解读
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • #HarmonyOS:基础语法
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (33)STM32——485实验笔记
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (zt)最盛行的警世狂言(爆笑)
  • (八十八)VFL语言初步 - 实现布局
  • (纯JS)图片裁剪
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (每日一问)基础知识:堆与栈的区别
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (三分钟)速览传统边缘检测算子
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • ./和../以及/和~之间的区别
  • .Net Core webapi RestFul 统一接口数据返回格式
  • @Not - Empty-Null-Blank
  • @RequestParam详解
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [<死锁专题>]
  • [20181219]script使用小技巧.txt