给定两个整数数组 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; } }