👨🏫 题目地址
💝 思路
💖 Ac Code
/**
* 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 {
HashMap<Integer, Integer> map = new HashMap<>();//存储某个结点在中序遍历序列的下标
public TreeNode buildTree(int[] preorder, int[] inorder)
{
for (int i = 0; i < inorder.length; i++)
map.put(inorder[i], i);//map[x][i] 表示结点 x 在中序遍历数组的下标是 i
return build(preorder, 0, preorder.length, inorder, 0, inorder.length);
}
private TreeNode build(int[] preorder, int pStart, int pEnd, int[] inorder, int inStart, int inEnd)
{
if (pStart == pEnd)// 起点==终点 递归出口
return null;
int root = preorder[pStart];// 先序遍历的第一个结点是根节点
TreeNode ans = new TreeNode(root);
int inRootIdx = map.get(root);
// int inRootIdx = 0;// 根节点在中序遍历序列的下标
// for (int i = inStart; i < inEnd; i++)
// if (root == inorder[i])
// {
// inRootIdx = i;
// break;
// }
int left = inRootIdx - inStart;//当前子树的左子树的结点个数
//递归处理当前树的左右子树
//排除根节点,左子树的范围 pre[pStart + 1, pStart + 1 + left),in[inStart,inRootIdx+1)
ans.left = build(preorder, pStart + 1, pStart + 1 + left, inorder, inStart, inRootIdx);
//排除根节点,右子树的范围 pre[pStart + 1 + left, pEnd),in[inRootIdx+1,inEnd)
ans.right = build(preorder, pStart + 1 + left, pEnd, inorder, inRootIdx + 1, inEnd);
return ans;
}
}