105. 从前序与中序遍历序列构造二叉树
深度优先搜索
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
return buildSonTree(preorder, 0, preorder.length, inorder, 0, inorder.length);
}
/**
* 左闭右开区间
* 将前序数组的第一个元素作为根节点,然后找到中序数组中根节点的位置,将其一分为二
* 然后根据左右子数组的长度,将前序数组也分成相等长度的左右子数组,继续递归分割(因为两个数组长度相等)
* 定义分割方法,分别传入两个数组,和要分割数组的边界
*/
public TreeNode buildSonTree(int[] preorder, int preLeft, int preRight, int[] inorder, int inLeft, int inRight){
/**
* 如果数组为空,或者只有一个元素,则该节点就是根节点
*/
if (preRight - preLeft == 0){
return null;
}
if (preRight - preLeft == 1){
return new TreeNode(preorder[preLeft]);
}
/**
* 否则记录下根节点的位置
*/
int rootVal = preorder[preLeft];
TreeNode root = new TreeNode(rootVal);
int index = 0;
for (int i = inLeft; i < inRight; i++) {
if (inorder[i] == rootVal){
index = i;
break;
}
}
/**
* 然后传入新的数组边界,继续分割
*/
root.left = buildSonTree(preorder, preLeft + 1, preLeft + index - inLeft + 1, inorder, inLeft, index);
root.right = buildSonTree(preorder, preLeft + index - inLeft + 1, preRight, inorder, index + 1, inRight);
return root;
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(n)
*/
https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】