1. 题目
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
示例 1:
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]
示例 2:
Input: preorder = [-1], inorder = [-1]
Output: [-1]
限制:
0 <= 节点个数 <= 5000
作者:Krahets
链接:https://leetcode.cn/leetbook/read/illustration-of-algorithm/99lxci/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2. 解题思路
个人思路
每次查找前序遍历的节点0作为root
节点,在中序遍历中查找root
节点所在位置,根据位置下标i
将中序遍历数组分为左右两个左右子数组[0,i-1]
和[i+1,len-1]
,对前序遍历数组,根据左右子树组的长度相同同样进行分组划分,然后递归调用函数,处理左右子树。
3. 数据类型功能函数总结
//数组 int[] array_name=new int[len];//数组定义 int len=array_name.length;//获得数组长度
4. java代码
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { if(preorder.length==0&&inorder.length==0){//特殊情况,也是递归的边界条件 return null; } else{ //构造根节点 int root_val=preorder[0];//前序遍历的首元素为根节点的值 TreeNode root=new TreeNode(root_val);//创建根节点 //在中序遍历数组中查找根节点位置 int find_root=0; int i=0; for(i=0;i<inorder.length&&find_root==0;i++){ if(inorder[i]==root_val){ find_root=1; } }//此时得到下标i+1,[0,i-1][i][i+1,len-1] //数组二分 i--; int[] left_inorder=new int[i]; int[] right_inorder=new int[inorder.length-i-1]; int[] left_preorder=new int[i]; int[] right_preorder=new int[inorder.length-i-1]; for(int j=0;j<i;j++){ left_inorder[j]=inorder[j]; left_preorder[j]=preorder[j+1]; } for(int j=i+1;j<inorder.length;j++){ right_inorder[j-i-1]=inorder[j]; right_preorder[j-i-1]=preorder[j]; } //递归调用 root.left= buildTree(left_preorder, left_inorder); root.right= buildTree(right_preorder, right_inorder); return root; } } }
分类:
leetcode刷题日志
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!