首页 > 其他分享 >3598. 二叉树遍历 已知前序 中序 求后序遍历

3598. 二叉树遍历 已知前序 中序 求后序遍历

时间:2024-05-31 09:04:31浏览次数:25  
标签:左子 遍历 中序 节点 substr 二叉树 前序

#include <iostream>
using namespace std;

void postOrder(string pre, string in) // 定义后序遍历函数,参数为前序遍历和中序遍历结果字符串
{
    if (in.size())
    {
        char root = pre[0]; // 获取前序遍历结果的第一个字符作为根节点
        int k = in.find(root); // 在中序遍历结果中找到根节点的位置
        postOrder(pre.substr(1, k), in.substr(0, k)); // 递归处理左子树
        postOrder(pre.substr(k + 1), in.substr(k + 1)); // 递归处理右子树
        printf("%c", root); // 输出根节点
    }
}

int main()
{
    string preOrder, inOrder;
    while (cin >> preOrder >> inOrder) // 循环读取输入的前序遍历和中序遍历结果
    {
        postOrder(preOrder, inOrder); // 调用后序遍历函数
        cout << endl; // 输出换行符
    }
    return 0;
}

postOrder 函数接收两个参数:前序遍历结果字符串 pre 和中序遍历结果字符串 in

postOrder 函数中,首先判断中序遍历结果字符串 in 是否为空,如果不为空,则说明当前节点有子节点需要处理。接着,获取前序遍历结果的第一个字符作为根节点,并在中序遍历结果中找到该根节点的位置 k

然后,递归调用 postOrder 函数处理左子树和右子树。具体来说,对于左子树,传入的前序遍历结果字符串为 pre.substr(1, k),中序遍历结果字符串为 in.substr(0, k);对于右子树,传入的前序遍历结果字符串为 pre.substr(k + 1),中序遍历结果字符串为 in.substr(k + 1)

最后,输出根节点的值。这样,通过递归调用 postOrder 函数,就可以按照后序遍历的顺序输出整个二叉树的节点值。

pre.substr(1, k)in.substr(0, k) 用于获取左子树的前序遍历和中序遍历结果,而 pre.substr(k + 1)in.substr(k + 1) 用于获取右子树的前序遍历和中序遍历结果。这些参数的取值是基于二叉树的前序遍历和中序遍历的特性。

前序遍历和中序遍历的特性:

  1. 前序遍历:根节点 -> 左子树 -> 右子树
  2. 中序遍历:左子树 -> 根节点 -> 右子树

参数解释:

  • pre.substr(1, k):从前序遍历字符串中提取左子树的前序遍历结果。由于前序遍历是先访问根节点,然后是左子树,最后是右子树,因此左子树的前序遍历结果从第二个字符开始(索引为1),长度为 k(因为根节点已经在 pre[0] 中处理过了)。

  • in.substr(0, k):从中序遍历字符串中提取左子树的中序遍历结果。由于中序遍历是先访问左子树,然后是根节点,最后是右子树,因此左子树的中序遍历结果从第一个字符开始(索引为0),长度为 k(因为根节点已经在中序遍历的 k 位置找到了)。

  • pre.substr(k + 1)in.substr(k + 1):这些用于提取右子树的前序遍历和中序遍历结果。由于左子树的最后一个节点在中序遍历中的索引是 k,因此右子树的部分从 k + 1 开始。

总结:

这些参数的取值是为了确保正确地从原始的前序遍历和中序遍历字符串中提取出左子树和右子树对应的部分。这样,递归调用 postOrder 函数时,可以正确地处理每个子树。

标签:左子,遍历,中序,节点,substr,二叉树,前序
From: https://blog.csdn.net/2303_79132118/article/details/139237690

相关文章

  • 完全二叉树查找
    描述有一棵树,输出某一深度的所有节点,有则输出这些节点,无则输出EMPTY。该树是完全二叉树。输入描述输入有多组数据,遇到0时终止输入。每组输入一个n(1<=n<=1000),然后将树中的这n个节点依次输入,再输入一个d代表深度。输出描述输出该树中第d层得所有节点,节点间用空格隔开,最后......
  • 二叉树的创建与遍历(附有C++实现详细代码)
    一、引言在计算机科学中,二叉树是一种常见的数据结构,它的每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树的应用广泛,包括但不限于搜索算法、排序算法、存储结构等。本文将详细讨论二叉树的创建与遍历方法,并通过代码示例进行说明。二、二叉树的基本概念在介......
  • 5.二叉树详解(附习题)
    1.二叉树链式结构的实现1.1 前置说明在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。本文准备讲述一些二叉树的基础知识,此处手动快速创建一棵简单的二叉树,来快速进入二叉树操作学习,等二叉树结构了解的差不多时,我们反过头再来研究二叉树真正......
  • PTA——数和二叉树
    7-10建立与遍历二叉树以字符串的形式定义一棵二叉树的先序序列,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。读入相应先序序列,建立二叉链式存储结构的二叉树,然后中序遍历该二叉树并输出结点数据。输入格式:字符串形式的先序序列(即结点的数据类型为单......
  • (二刷)代码随想录第17天|● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之
    110.平衡二叉树math.abs指的是绝对值;这棵树的左右子树的高度差小于1的时候,同时该树的左右子树都是平衡二叉树的时候,这棵树才是平衡二叉树;classSolution{publicbooleanisBalanced(TreeNoderoot){returngetHeight(root)!=-1;}privateint......
  • 有向图的创建以及遍历
    有向图的创建有很多种方法,这里简要介绍邻接表的创建,以及通过邻接表创建的有向图进行深度优先算法以及广度优先算法可以先看看,具体文件的格式,大家想要实现的话,需要在桌面上创建一个txt格式的文件,然后将其命名为linjiebiao57v1v2v3v4v501031423243240文件......
  • 数据结构与算法学习——二叉树
    题目PS:下列题目均来自leetcode中灵神题单938.二叉搜索树的范围和classSolution:defrangeSumBST(self,root:TreeNode,low:int,high:int)->int:ifnotroot:return0ifroot.val>high:returnself.rangeSumBST(r......
  • 我见我思之hvv偷师学艺——目录遍历/路径遍历/文件遍历 漏洞
    注:本文仅作为技术交流使用,如有违反行为本文作者概不负责。常见告警信息价值提取:源IP大概率为代理IP,可通过威胁情报平台进行识别此IP的历史攻击行为。源端口参考意义不大。目的IP我方资产IP(可定位疑似存在漏洞的资产的具体范围)。目的端口我方资产IP对应端口(可通过端口辅助......
  • 代码随想录算法训练Day20|LeetCode654-最大二叉树、LeetCode617-合并二叉树、LeetCode
    最大二叉树题目描述力扣654-最大二叉树给定一个不重复的整数数组nums。最大二叉树可以用下面的算法从nums递归地构建:创建一个根节点,其值为nums中的最大值。递归地在最大值左边的子数组前缀上构建左子树。递归地在最大值右边的子数组后缀上构建右子树。......
  • 二叉树——堆详解
    目录前言:一、堆的结构二、向上调整和向下调整    2.1向上调整    2.2向下调整    2.3向上调整和向下调整时间复杂度比较三、堆的实现    3.1堆的初始化    3.2堆的销毁    3.3堆的插入       ......