【LeetCode】105. 从前序与中序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树

知识点:二叉树,递归

题目描述

根据一棵树的中序遍历与前序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

示例
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] Output: [3,9,20,null,null,15,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 Input: preorder = [-1], inorder = [-1] Output: [-1]

解法一:递归

函数的功能:从一个树的前序和中序遍历中还原一颗树。
1.终止条件:如果前序和中序的数组为空,返回null;
2.该做什么:根据前序遍历的特点能够知道第一个就是其根节点,然后根据此值可以在中序遍历中定位出来,然后根据在中序遍历中的值可以将其分成左右两个序列,左边就是其左子树,右边就是其右子树,这样就得到了左子树和右子树的中序遍历;同理,在前序中第一个元素后跟着的左子树个数个元素就是左子树的前序遍历,再跟着的就是右子树的前序遍历,这样就又能到了前序和中序,递归调用就可以了。
3.什么时候做:逐步缩小树的规模,提供子树的前序和中序供下层使用:前序;

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { if(preorder == null) return null; Map<Integer, Integer> map = new HashMap<>(); for(int i = 0; i < inorder.length; i++){ map.put(inorder[i], i); } return buildTree(preorder, inorder, 0, preorder.length-1, 0, inorder.length-1, map); } private TreeNode buildTree(int[] preorder, int[] inorder, int preleft, int preright, int inleft, int inright, Map<Integer, Integer> map){ if(preleft > preright) return null; TreeNode root = new TreeNode(preorder[preleft]); int rootIndex = map.get(root.val); int leftTreeSize = rootIndex-inleft; root.left = buildTree(preorder, inorder, preleft+1, preleft+leftTreeSize, inleft, rootIndex-1, map); root.right = buildTree(preorder, inorder, preleft+leftTreeSize+1, preright, rootIndex+1, inright, map); return root; } }

相关题目

106. 从中序与后序遍历序列构造二叉树


__EOF__

本文作者Curryxin
本文链接https://www.cnblogs.com/Curryxin/p/15067418.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Curryxin  阅读(53)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
Live2D
欢迎阅读『【LeetCode】105. 从前序与中序遍历序列构造二叉树』
点击右上角即可分享
微信分享提示