题解 | #牛群的树形结构重建II# java
牛群的树形结构重建II
https://www.nowcoder.com/practice/ad81ec30cca0477e82e33334a652a6ae
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param preOrder int整型一维数组
* @param inOrder int整型一维数组
* @return TreeNode类
*/
private Map<Integer, Integer> pos;
/**
* 根据前序遍历和中序遍历构建二叉树
*
* @param preOrder 前序遍历结果数组
* @param preLeft 前序遍历结果的左边界
* @param preRight 前序遍历结果的右边界
* @param inLeft 中序遍历结果的左边界
* @return 构建好的二叉树的根节点
*/
public TreeNode buildTree(int[] preOrder, int preLeft, int preRight,
int inLeft) {
if (preLeft > preRight) return null;
// 根据根节点值在中序遍历结果中找到根节点的位置
int inRoot = pos.get(preOrder[preLeft]);
// 创建根节点
TreeNode root = new TreeNode(preOrder[preLeft]);
// 计算左子树的大小
int leftSubtreeSize = inRoot - inLeft;
// 递归构建左子树和右子树
root.left = buildTree(preOrder, preLeft + 1, preLeft + leftSubtreeSize, inLeft);
root.right = buildTree(preOrder, preLeft + leftSubtreeSize + 1, preRight,
inRoot + 1);
return root;
}
/**
* 根据前序遍历和中序遍历构建二叉树
*
* @param preOrder 前序遍历结果数组
* @param inOrder 中序遍历结果数组
* @return 构建好的二叉树的根节点
*/
public TreeNode buildTreeII(int[] preOrder, int[] inOrder) {
pos = new HashMap<>();
// 构建中序遍历结果中值到索引的映射,加快查找根节点位置的速度
for (int i = 0; i < inOrder.length; ++i) {
pos.put(inOrder[i], i);
}
// 调用递归函数构建二叉树
return buildTree(preOrder, 0, preOrder.length - 1, 0);
}
}
该代码使用的编程语言是Java。
此代码考察了以下知识点:
- 二叉树的构建和遍历:根据给定的前序遍历和中序遍历结果,构建二叉树。
- 递归:通过递归的方式构建二叉树,每次处理左子树和右子树。
- 哈希表(HashMap)的使用:为了加快查找根节点位置的速度,将中序遍历结果中的元素及其对应的索引存储在哈希表中。
代码的文字解释大纲如下:
- 构建了一个树节点类
TreeNode,表示二叉树的节点。 - 创建了一个
Solution类,包含了构建二叉树的方法buildTree和buildTreeII。 buildTree方法根据给定的前序遍历和中序遍历结果构建二叉树。方法中传入了前序遍历结果数组、前序遍历结果的左边界和右边界以及中序遍历结果的左边界。首先判断边界情况,如果左边界大于右边界,则返回空节点。在中序遍历结果中找到根节点的位置(通过哈希表加快查找速度)。创建根节点,并递归构建左子树和右子树。返回构建好的二叉树的根节点。buildTreeII方法是对外公开的方法,用于调用buildTree方法构建二叉树。方法中传入了前序遍历结果数组和中序遍历结果数组。创建一个哈希表,存储中序遍历结果中的元素及其在数组中的索引。调用 buildTree 方法构建二叉树,并返回根节点。
