LCR 124. 推理二叉树
解题思路
-
首先定义了一个二叉树节点类 TreeNode,包含节点值 val、左子节点 left 和右子节点 right。
-
在 Solution 类中定义了一个 Map 类型的成员变量 valToIndex,用于存储中序遍历的节点值和对应的索引。
-
buildTree 方法是构建二叉树的入口方法,接受前序遍历数组和中序遍历数组作为参数,返回构建好的二叉树。
-
在 buildTree 方法中,首先遍历中序遍历数组,将其中每个节点值和其索引存入 valToIndex 中。
-
然后调用 build 方法进行递归构建二叉树,传入前序遍历数组、中序遍历数组以及各自的起始和结束位置。
-
build 方法中,首先判断前序遍历起始位置是否超过了结束位置,如果是,则返回 null。
-
接着取出当前子树的根节点值,根据该值在中序遍历数组中的索引找到左子树和右子树的范围。
-
计算左子树的大小,然后创建当前子树的根节点。
-
递归构建左子树和右子树,更新前序遍历和中序遍历的起始和结束位置,并将左右子树连接到根节点上。
-
最后返回根节点,完成整个二叉树的构建。
/**
* 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 {
Map<Integer,Integer> valToIndex = new HashMap<>();// 存储中序遍历的数字以及索引
public TreeNode buildTree(int[] preorder, int[] inorder) {
for(int i = 0; i < inorder.length; i++){
valToIndex.put(inorder[i],i);
}
return build(preorder,0,preorder.length - 1,inorder,0,inorder.length - 1);
}
TreeNode build(int[] preorder,int preStart,int preEnd,
int[] inorder,int inStart,int inEnd){
if(preStart > preEnd){
return null;
}
int rootVal = preorder[preStart];// 记录根节点
// 找到中序遍历根节点的索引
int index = valToIndex.get(rootVal);
int leftsize = index - inStart;
TreeNode root = new TreeNode(rootVal);
root.left = build(preorder,preStart + 1,preStart + leftsize,
inorder,inStart,index - 1);
root.right = build(preorder,preStart + leftsize + 1,preEnd,
inorder,index + 1,inEnd);
return root;
}
}