给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
提示:preorder 和 inorder 均 无重复 元素
输入:二叉树的前序和中序遍历,两个整型数组
输出:二叉树的根结点
思路:将中序遍历的结果存入哈希表中,然后通过前序遍历知道二叉树的根结点,然后递归
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
//错误输入检验
int preLen = preorder.length;
int inLen = inorder.length;
if(preLen != inLen){
throw new RuntimeException("input error");
}
//构建哈希表存储中序遍历的值
Map<Integer, Integer> map = new HashMap<>();
//值做key,下标做value
for(int i = 0; i < inLen; i++){
map.put(inorder[i], i);
}
//然后递归调用
return myBuildTree(preorder, 0, preLen - 1, map, 0, inLen - 1);
}
public TreeNode myBuildTree(int[] preorder, int preLeft, int preRight, Map<Integer,Integer> map, int inLeft, int inRight){
//递归结束条件
if(preLeft > preRight || inLeft > inRight){
return null;
}
//创建根结点
TreeNode root = new TreeNode(preorder[preLeft]);
int pIndex = map.get(preorder[preLeft]);
root.left = myBuildTree(preorder, preLeft + 1, pIndex + preLeft - inLeft, map, inLeft, pIndex - 1);
root.right = myBuildTree(preorder, pIndex + preLeft - inLeft + 1, preRight, map, pIndex + 1, inRight);
return root;
}
}
注意对于索引的计算