【算法】重建二叉树并进行后序遍历的Java实现

人不走空

                                                                      

      🌈个人主页:人不走空      

💖系列专栏:算法专题

⏰诗词歌赋:斯是陋室,惟吾德馨

目录

      🌈个人主页:人不走空      

💖系列专栏:算法专题

⏰诗词歌赋:斯是陋室,惟吾德馨

问题描述

实现思路

实现步骤

1. 重建二叉树

2. 后序遍历

代码实现

代码解释

总结

作者其他作品:


在二叉树的问题中,给定二叉树的前序遍历(Preorder)和中序遍历(Inorder)序列,如何求得其后序遍历(Postorder)序列是一个经典的面试题。本文将详细介绍如何通过Java实现这一过程。

问题描述

前序遍历(Preorder):按根节点 -> 左子树 -> 右子树的顺序访问节点。

中序遍历(Inorder):按左子树 -> 根节点 -> 右子树的顺序访问节点。

后序遍历(Postorder):按左子树 -> 右子树 -> 根节点的顺序访问节点。

给定前序遍历和中序遍历序列,我们需要构建二叉树并输出其后序遍历序列。

实现思路

  1. 重建二叉树:利用前序遍历和中序遍历的特性,通过递归方法重建二叉树。
  2. 后序遍历二叉树:通过递归方法进行后序遍历并输出结果。

实现步骤

1. 重建二叉树

首先,我们通过前序遍历的第一个元素确定根节点。在中序遍历中找到该根节点的位置,可以将中序遍历数组分为左子树和右子树两部分。递归地对这两部分继续构建左右子树。

2. 后序遍历

在构建好的二叉树上进行后序遍历,按左子树 -> 右子树 -> 根节点的顺序输出节点值。

代码实现

以下是完整的Java实现代码:

import java.util.HashMap;
import java.util.Map;class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }
}public class BinaryTree {private int preIndex = 0;private Map<Integer, Integer> inorderIndexMap = new HashMap<>();public TreeNode buildTree(int[] preorder, int[] inorder) {for (int i = 0; i < inorder.length; i++) {inorderIndexMap.put(inorder[i], i);}return buildTreeHelper(preorder, 0, inorder.length - 1);}private TreeNode buildTreeHelper(int[] preorder, int inorderStart, int inorderEnd) {if (inorderStart > inorderEnd) {return null;}int rootVal = preorder[preIndex++];TreeNode root = new TreeNode(rootVal);int inorderIndex = inorderIndexMap.get(rootVal);root.left = buildTreeHelper(preorder, inorderStart, inorderIndex - 1);root.right = buildTreeHelper(preorder, inorderIndex + 1, inorderEnd);return root;}public void postorderTraversal(TreeNode root) {if (root == null) {return;}postorderTraversal(root.left);postorderTraversal(root.right);System.out.print(root.val + " ");}public static void main(String[] args) {int[] preorder = {3, 9, 20, 15, 7};int[] inorder = {9, 3, 15, 20, 7};BinaryTree binaryTree = new BinaryTree();TreeNode root = binaryTree.buildTree(preorder, inorder);System.out.println("Postorder traversal:");binaryTree.postorderTraversal(root);}
}

代码解释

  1. TreeNode类:定义二叉树节点的数据结构。

    class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }
    }
    
  2. BinaryTree类:包含重建二叉树和后序遍历的方法。

    • buildTree 方法:接受前序遍历和中序遍历数组,构建并返回二叉树的根节点。
    • buildTreeHelper 方法:递归地构建二叉树。
    • postorderTraversal 方法:递归地进行后序遍历,并输出节点值。
  3. buildTreeHelper方法:通过前序遍历的当前节点值和中序遍历的索引,递归地构建左右子树。

    private TreeNode buildTreeHelper(int[] preorder, int inorderStart, int inorderEnd) {if (inorderStart > inorderEnd) {return null; // Base case: no elements to construct the tree}int rootVal = preorder[preIndex++]; // Get the current root value from preorder traversalTreeNode root = new TreeNode(rootVal); // Create the root nodeint inorderIndex = inorderIndexMap.get(rootVal); // Find the index of the root in inorder traversal// Recursively build the left subtreeroot.left = buildTreeHelper(preorder, inorderStart, inorderIndex - 1);// Recursively build the right subtreeroot.right = buildTreeHelper(preorder, inorderIndex + 1, inorderEnd);return root;
    }
    
  4. 后序遍历:通过递归方法进行后序遍历,按照左子树 -> 右子树 -> 根节点的顺序输出节点值。

    public void postorderTraversal(TreeNode root) {if (root == null) {return;}postorderTraversal(root.left);postorderTraversal(root.right);System.out.print(root.val + " ");
    }
    
  5. main方法:创建前序遍历和中序遍历数组,调用buildTree方法构建二叉树,然后调用postorderTraversal方法输出后序遍历结果。

    public static void main(String[] args) {int[] preorder = {3, 9, 20, 15, 7};int[] inorder = {9, 3, 15, 20, 7};BinaryTree binaryTree = new BinaryTree();TreeNode root = binaryTree.buildTree(preorder, inorder);System.out.println("Postorder traversal:");binaryTree.postorderTraversal(root);
    }
    

总结

通过上述步骤,我们可以实现根据前序遍历和中序遍历序列重建二叉树,并输出其后序遍历序列。这不仅帮助我们加深对二叉树遍历的理解,也为处理相关面试题提供了一个有力的工具。希望这篇文章对你有所帮助!


作者其他作品:

【Java】Spring循环依赖:原因与解决方法

OpenAI Sora来了,视频生成领域的GPT-4时代来了

[Java·算法·简单] LeetCode 14. 最长公共前缀 详细解读

【Java】深入理解Java中的static关键字

[Java·算法·简单] LeetCode 28. 找出字a符串中第一个匹配项的下标 详细解读

了解 Java 中的 AtomicInteger 类

算法题 — 整数转二进制,查找其中1的数量

深入理解MySQL事务特性:保证数据完整性与一致性

Java企业应用软件系统架构演变史 

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

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

相关文章

服务器主机托管一站式托管服务有哪些?

服务器主机托管一站式托管服务&#xff0c;作为现代企业信息化建设的重要一环&#xff0c;为企业提供了一种高效、安全、可靠的服务器运行环境。下面&#xff0c;我们将从多个方面详细介绍这一服务的内容。 一、硬件与基础设施 服务器主机托管服务首先涵盖了服务器硬件和网络基…

论文解读之A General-Purpose Self-Supervised Model for Computational Pathology

一、前言 目前&#xff0c;有很多无知者认为计算机在疾病诊断上超过了人类&#xff0c;他们的理解是计算机在美丽国的某个什么医师测评上得分超过了人类。这比较可笑和无知。 笔者认为&#xff1a;病理图像的病症复杂、种类繁多&#xff0c;同时数据集很少并且标注极为困难。…

【JavaEE进阶】——Spring Web MVC (响应)

目录 &#x1f6a9;学习Spring MVC &#x1f388;返回静态网页 &#x1f388;返回数据ResponseBody &#x1f388;返回html代码片段 &#x1f388;返回JSON &#x1f388;设置状态码 &#x1f388;设置Header &#x1f6a9;学习Spring MVC 既然是 Web 框架, 那么当⽤⼾在…

剪画小程序:自媒体创作的第一步:如何将视频中的文案提取出来?

自媒体创作第一步&#xff0c;文案提取无疑是至关重要的一环。 做自媒体之所以要进行文案提取&#xff0c;有以下重要原因&#xff1a; 首先&#xff0c;提高效率。通过文案提取&#xff0c;可以快速获取关键信息&#xff0c;避免在无关紧要的内容上浪费时间&#xff0c;从而…

YOLOV10阅读总结

GitHub - THU-MIG/yolov10: YOLOv10: Real-Time End-to-End Object Detection YOLOv10 - Ultralytics YOLO Docs https://arxiv.org/pdf/2405.14458 论文地址 最近yolo又出了个yolov10了&#xff0c;不得不感慨CV是真卷&#xff0c;毕竟yolov9也才没多久。记录一下阅读笔记。…

第一站挺进巴中,茅仙酒带来“1+1”模式新玩法

执笔 | 尼 奥 编辑 | 扬 灵 今年春糖期间&#xff0c;以“盛世华章何以鉴 酱酒经典品茅仙”为主题的茅仙酒新品发布会给白酒行业留下深刻印象。这瓶传承历史、恪守匠心、创美奋进的佳酿在“茅台家族、集团出品”的品牌加持下&#xff0c;开启了全国化征程的新步伐。 近日&…

突破空间限制,这些远程控制软件为父母送上“手把手”的教导,解决异地办公难题,出差无忧

在现代社会&#xff0c;科技的飞速发展带来了诸多便利&#xff0c;但同时也给一些年长的父母们带来了困扰。 当父母们面对智能手机电脑等高科技产品时&#xff0c;他们往往感到无所适从&#xff0c;而子女们忙于工作、学习或其他原因&#xff0c;常常无法时刻陪伴在父母身边&a…

门限签名技术

私钥永远不存在 (t, n) 门限签名方案 (TSS) 是一种密码协议&#xff0c;允许一组 n 个参与者共同签署文档或交易&#xff0c;其中 t 1 个或更多参与者的任何子集都可以产生有效签名&#xff0c;但 t 的子集 或更少的人不能。 该方案旨在通过确保没有任何一方可以单方面生成签名…

企业内部聊天软件Riot部署

ubuntu docker 简介 Riot(原Vector)是使用Matrix React SDK构建的Matrix网络聊天客户端,开源免费,功能丰富,支持私人对话,团队对话,语言视频对话,上传文件,社区互动。支持在聊天界面添加各种有趣的插件,比如RSS等各种机器人、虚拟币实时监控等。并且所有通过Riot传…

注意力机制篇 | YOLOv8改进之引入用于目标检测的混合局部通道注意力MLCA

前言:Hello大家好,我是小哥谈。注意力机制是可以帮助神经网络突出重要元素,抑制无关元素。然而,绝大多数通道注意力机制只包含通道特征信息,忽略了空间特征信息,导致模型表示效果或目标检测性能较差,且空间注意模块往往较为复杂。为了在性能和复杂性之间取得平衡,本文提…

【自动化运营】PlugLink 1.0开源版发布

什么是PlugLink&#xff1f; PlugLink&#xff0c;顾名思义&#xff0c;就是插件的链接。它旨在帮助个人和小微企业实现运营自动化&#xff0c;通过链接脚本、API、AI大模型等&#xff0c;实现全自动工作流程。你可以把PlugLink看作一个巨大的拼装积木&#xff0c;每一个插件都…

【数据结构和算法】-动态规划爬楼梯

动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是运筹学的一个分支&#xff0c;主要用于解决包含重叠子问题和最优子结构性质的问题。它的核心思想是将一个复杂的问题分解为若干个子问题&#xff0c;并保存子问题的解&#xff0c;以便在需要时直接利用&am…

【稳定检索】2024年核能科学与材料、物理应用国际会议(NESMPA 2024)

2024年核能科学与材料、物理应用国际会议 2024 International Conference on Nuclear Energy Science and Materials, Physical Applications 【1】会议简介 2024年核能科学与材料、物理应用国际会议即将拉开帷幕&#xff0c;这是一场汇聚全球核能科学、材料研究及物理应用领域…

文件上传漏洞简介

目录 漏洞原理 漏洞危害 利用场景 检测方法 防御方法 绕过手段 前端JS绕过 构造可解析后缀 修改Content-Type&#xff08;MIME&#xff09; 大小写绕过 文件头绕过 图片马 截断与特殊文件名 其他绕过 尝试绕过的步骤 漏洞原理 原理 攻击者构造恶意文件进行上传…

低调收藏,这份MobaXterm使用指南很全面

中午好&#xff0c;我的网工朋友。 MobaXterm&#xff0c;这个名字对于我们这些经常需要在Windows环境下与Linux服务器打交道的人来说&#xff0c;应该并不陌生。它不仅仅是一个SSH客户端&#xff0c;更是一个功能强大的终端工具箱&#xff0c;集成了X服务器和Unix命令集&…

醒图及国际版 v9.9.9/v3.9.0 解锁会员(让照片栩栩如生的神奇应用)

介绍 醒图App是一款专业的照片编辑工具&#xff0c;旨在帮助用户高效地处理和优化照片&#xff0c;使其更加引人注目。这款应用程序配备了多样化的功能&#xff0c;包括图像增强、滤镜应用以及色彩调整等&#xff0c;以满足各种编辑需求。其设计了一个直观的用户界面&#xff…

全球首例光伏电场网络攻击事件曝光

快速增长的光伏发电正面临日益严重的网络安全威胁。近日&#xff0c;日媒报道了首个针对光伏电场的网络攻击事件。 首例公开确认的光伏电网攻击 日本媒体《产经新闻》近日报道&#xff0c;黑客劫持了一个大型光伏电网中的800台远程监控设备(由工控电子制造商Contec生产的Solar…

ABS三星!IF:6.0+新刊,中科院2区SSCI,1个月左右见刊!OA无需版面费,领域权威期刊!

【欧亚科睿学术】 01 期刊基本概况 【期刊类型】管理类SSCI 【出版社】TAYLOR & FRANCIS出版社 【期刊概况】IF&#xff1a;6.0-7.0&#xff0c;JCR2区&#xff0c;中科院2区 【版面类型】正刊&#xff0c;仅10篇版面 【预警情况】2020-2024年无预警记录 【收录年份…

详解 HTML5 服务器发送事件(Server-Sent Events)

HTML5 服务器发送事件&#xff08;server-sent event&#xff09;允许网页获得来自服务器的更新。 EventSource 是单向通信的&#xff08;是服务器向客户端的单向通信&#xff0c;客户端接收来自服务器的事件流&#xff09;、基于 HTTP 协议&#xff08;EventSource 是基于标准…

TalkingData数据统计

一、简介 TalkingData是一家提供移动应用数据统计和分析的公司&#xff0c;专注于移动应用数据的收集、分析和可视化。TalkingData通过收集应用程序的用户行为数据&#xff0c;如应用下载量、用户留存率、用户活跃度等&#xff0c;帮助开发者了解用户行为趋势、优化应用功能、…