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

Leetcode JAVA刷刷站(105)从前序与中序遍历序列构造二叉树

一、题目概述

 二、思路方向 

  1. 理解遍历顺序
    • 先序遍历(preorder):根节点 -> 左子树 -> 右子树
    • 中序遍历(inorder):左子树 -> 根节点 -> 右子树
  2. 利用先序遍历的第一个元素作为根节点
    • 先序遍历的第一个元素总是当前子树的根节点。
  3. 在中序遍历中找到根节点的位置
    • 这个位置将中序遍历分为左子树和右子树。
  4. 递归构建左子树和右子树
    • 使用中序遍历中根节点左侧的数组构建左子树,使用先序遍历中根节点之后的元素构建左子树。
    • 使用中序遍历中根节点右侧的数组构建右子树,使用先序遍历中左子树之后(即根节点之后紧接着的元素)的元素构建右子树。
  5. 递归终止条件
    • 当先序遍历或中序遍历的数组为空时,返回null。

三、代码实现 

class TreeNode {  
    int val;  
    TreeNode left;  
    TreeNode right;  
  
    TreeNode(int x) {  
        val = x;  
    }  
}  
  
public class Solution {  
    public TreeNode buildTree(int[] preorder, int[] inorder) {  
        if (preorder == null || inorder == null || preorder.length != inorder.length) {  
            return null;  
        }  
        return buildTreeHelper(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);  
    }  
  
    private TreeNode buildTreeHelper(int[] preorder, int preStart, int preEnd, int[] inorder, int inStart, int inEnd) {  
        if (preStart > preEnd || inStart > inEnd) {  
            return null;  
        }  
  
        // 先序遍历的第一个元素是根节点  
        int rootVal = preorder[preStart];  
        TreeNode root = new TreeNode(rootVal);  
  
        // 在中序遍历中找到根节点的位置  
        int rootIndexInorder = inStart;  
        while (inorder[rootIndexInorder] != rootVal) {  
            rootIndexInorder++;  
        }  
  
        // 构建左子树和右子树  
        int leftSubtreeSize = rootIndexInorder - inStart;  
        root.left = buildTreeHelper(preorder, preStart + 1, preStart + leftSubtreeSize, inorder, inStart, rootIndexInorder - 1);  
        root.right = buildTreeHelper(preorder, preStart + leftSubtreeSize + 1, preEnd, inorder, rootIndexInorder + 1, inEnd);  
  
        return root;  
    }  
}

执行结果: 

四、小结 

       这段代码首先定义了一个TreeNode类来表示二叉树的节点,然后Solution类中的buildTree方法利用buildTreeHelper递归地构建二叉树。buildTreeHelper是构建二叉树的核心逻辑。

 结语 

龙游浅水遭虾戏

虎落平阳被犬欺

!!!


http://www.kler.cn/a/292064.html

相关文章:

  • 【Oracle篇】掌握SQL Tuning Advisor优化工具:从工具使用到SQL优化的全方位指南(第六篇,总共七篇)
  • 8.C++面向对象5(实现一个较为完善的日期类)
  • 一个win32 / WTL下多线程库(CThread类)的使用心得
  • 通过地址获取LONG和LAT并且存入csv
  • 狼蛛F87Pro键盘常用快捷键的使用说明
  • C++ 的发展
  • SpringBoot 集成 kafka,并消费历史事件
  • Hive 安装
  • 如何选到好的宠物空气净化器,用哪款宠物空气净化器比较好?
  • 【C++】list底层的模拟实现
  • 10 先序遍历创建二叉树
  • PHP一站式解决方案高级房产系统小程序源码
  • WebSocket的详细介绍(打开你对WebSocket的认识)
  • 【openwrt-21.02】T750 openwrt MT7916 WPS PBC功能实现
  • 关于cookie和session的直观讲解(二)
  • 基于 Konva 实现Web PPT 编辑器(二)
  • 二维高斯函数的两种形式
  • iOS——weak修饰符的学习补充
  • flutter和android原生 界面显示的原理是什么,有什么异同。
  • 利用Python脚本批量管理Linux服务器部署服务
  • html+css网页设计 合十文化2个页面
  • c++ 定义函数
  • 为什么要有mybatis?——mybatis
  • Gitlab删除本地标签和分支
  • 使用 RabbitMQ 和 Go 构建异步订单处理系统
  • Apple “Glowtime”活动:iPhone 16、Apple Intelligence亮相