给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
示例 1:

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]
示例 2:
输入: preorder = [-1], inorder = [-1]
输出: [-1]
使用 分治大法:
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder == null) {
return null;
}
return dfs(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
}
public TreeNode dfs(int[] preorder, int ps, int pe, int[] inorder, int is, int ie) {
if (ps > pe || ps >= preorder.length) {
return null;
}
if (pe - ps == 0) {
return new TreeNode(preorder[pe]);
}
int startNum = preorder[ps];
TreeNode node = new TreeNode(startNum);
//去inorder寻找此数
int splitIndex = -1;
int splitCount = 0;
//从中序数组中,找到分割点
for (int i = is; i <= ie; i++) {
splitCount++;
if (inorder[i] == startNum) {
splitIndex = i;
break;
}
}
//分割点的左边为左子树
node.left = dfs(preorder, ps + 1, ps + splitCount - 1, inorder, is, splitIndex - 1);
//分割点的右边为左子树
node.right = dfs(preorder, ps + splitCount, pe, inorder, splitIndex + 1, ie);
return node;
}
}
本文介绍如何利用先序遍历和中序遍历重构二叉树,通过分治法实现从给定的整数数组中构造二叉树的根节点。详细讲解了递归函数的实现过程,包括查找分割点和构建左右子树的步骤。
627

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



