【算法】重建二叉树并进行后序遍历的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;我们将从多个方面详细介绍这一服务的内容。 一、硬件与基础设施 服务器主机托管服务首先涵盖了服务器硬件和网络基…

Java 18 新特性详解:提升开发效率与性能

Java 18 新特性详解 Java 18 是 Oracle 于 2022 年发布的最新版本,带来了许多新的特性和改进。本文将深入探讨 Java 18 的主要新特性及其应用场景,帮助开发者更好地理解和利用这些新功能。 1. 简单的 Web 服务器 Java 18 引入了一个简单的 HTTP 文件服务器,旨在为开发和测…

论文解读之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;从而…

Flutter 中的 YearPicker 小部件:全面指南

Flutter 中的 YearPicker 小部件&#xff1a;全面指南 在 Flutter 应用开发中&#xff0c;为用户提供日期和时间选择功能是常见的需求。YearPicker 是一个允许用户选择年份的小部件&#xff0c;它通常用于实现日期选择器或表单中年份字段的输入。虽然 Flutter 的标准库中没有直…

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…

Qt6 QSslSocket 客户端设计踩坑

QSslSocket 默认自动搜索代理设置&#xff0c;当系统中存在代理时&#xff0c;执行 connectToHostEncrypted 会导致 socket error: UnsupportedSocketOperationError&#xff0c;具体错误是 connect error is "The proxy type is invalid for this operation"&#…

门限签名技术

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

QCC30XX如何查找本地地址码

查找本地地址段/********************************************************************** Copyright (c) 2016 - 2017 Qualcomm Technologies International, Ltd. FILE NAME sink_private_data.c DESCRIPTION This module works as a container for all private and common…

企业内部聊天软件Riot部署

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

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

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

2024年刚刚翻新前端vue面试题

1、vue中常用的指令及作用? v-text指令:用于更新标签包含的文本,它的作用跟双大括号效果是一样的v-html指令:绑定一些包含html代码的数据在视图上v-show指令:指令的取值为true/false,分别对应着显示/隐藏,改变的是元素css样式的display属性v-if指令:取值为true/false,…

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

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

3.每日LeetCode-数组类,爬楼梯(Go,Java,Python)

目录 题目 解法 Go Java Python 代码地址&#xff1a;leetcode: 每日leetcode刷题 题目 题号70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff…

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

动态规划&#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;这是一场汇聚全球核能科学、材料研究及物理应用领域…

软RAID部署

目录 资源列表 基础环境 关闭防火墙 关闭内核安全机制 一、安装mdadm工具 二、磁盘分区 三、创建RAID 本文记录了软RAID的部署流程&#xff0c;希望能够帮到大家。 资源列表 操作系统配置主机名IP备注CentOS7.3.16112C4Gnode1192.168.207.131需要添加2块磁盘 基础环境…