/**
* 剑指 Offer 07. 重建二叉树
* @author wsq
* @date 2020/09/11
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof
*/
package notsubmit;
public class RebuildTree {
/**
* 采用递归的方式实现,由于每次递归都需要对原有的数组按照要求复制一部分,浪费了很多的时间和空间
* @param preorder
* @param inorder
* @return
*/
public TreeNode buildTree(int[] preorder, int[] inorder) {
int val = preorder[0];
int leftNum = getIndex(inorder, val);
int rightNum = preorder.length - leftNum - 1;
TreeNode node = new TreeNode(val);
if(leftNum != 0) {
// 需要优化,改为数组索引的形式
int[] leftPreorder = new int[leftNum];
System.arraycopy(preorder, 1, leftPreorder, 0, leftNum);
int[] leftInorder = new int[leftNum];
System.arraycopy(inorder, 0, leftInorder, 0, leftNum);
node.left = buildTree(leftPreorder, leftInorder);
}
if(rightNum != 0) {
int[] rightPreorder = new int[rightNum];
System.arraycopy(preorder, leftNum + 1, rightPreorder, 0, rightNum);
int[] rightInorder = new int[rightNum];
System.arraycopy(inorder, leftNum + 1, rightInorder, 0, rightNum);
node.right = buildTree(rightPreorder, rightInorder);
}
return node;
}
public int getIndex(int[] arr, int val) {
int ans = 0;
for(int i = 0; i < arr.length; ++i) {
if(arr[i] == val) {
ans = i;
break;
}
}
return ans;
}
public static void main(String[] args) {
int[] preorder = {3,9,20,15,7};
int[] inorder = {9,3,15,20,7};
RebuildTree rt = new RebuildTree();
TreeNode ndoe = rt.buildTree(preorder, inorder);
}
}
剑指 Offer 07. 重建二叉树
最新推荐文章于 2025-11-25 09:14:03 发布
本文详细解析了如何通过前序遍历和中序遍历结果重建二叉树的问题,提供了一种递归解决方案,并附带代码示例。适用于理解二叉树的遍历和构造原理。
565

被折叠的 条评论
为什么被折叠?



