1 题目
leetcode
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数组
2 解
这道题我自己解不出来,看了解析有想法但是实现不出来。
大体的思路就是 前序数组的第一个值就是树的根 ,在中序数组中找到它 ,它的左侧就是左子树,右侧就是右子树,第二个是左子树的根,以此类推,但是实现不出来,下面就对官解加上一些注释,希望能有所帮助。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
//非空判断
if (preorder == null || preorder.length == 0) {
return null;
}
//使用map存储中序数组中值与下标的关系,方便查询。
Map<Integer, Integer> indexMap = new HashMap<Integer, Integer>();
int length = preorder.length;
for (int i = 0; i < length; i++) {
indexMap.put(inorder[i], i);
}
//递归求解
TreeNode root = buildTree(preorder, 0, length - 1, inorder, 0, length - 1, indexMap);
return root;
}
public TreeNode buildTree(int[] preorder, int preorderStart, int preorderEnd, int[] inorder, int inorderStart, int inorderEnd, Map<Integer, Integer> indexMap) {
//起始下标大于中止下标,表明没有节点了
if (preorderStart > preorderEnd) {
return null;
}
//以起始下标的值创建节点
int rootVal = preorder[preorderStart];
TreeNode root = new TreeNode(rootVal);
//起始下标等于中止下标,表明只有一个节点,直接返回
if (preorderStart == preorderEnd) {
return root;
} else {
//找出当前根在中序数组的下标
int rootIndex = indexMap.get(rootVal);
//leftNodes表示左子树的数组长度,rightNodes表示右子树的数组长度
int leftNodes = rootIndex - inorderStart, rightNodes = inorderEnd - rootIndex;
//创建左子树,在前序中当前下标加一到当前下标加左子树数组长度都是左子树的节点下标。
//在中序中当前下标到当前根下标减一都是左子树的节点下标
TreeNode leftSubtree = buildTree(preorder, preorderStart + 1, preorderStart + leftNodes, inorder, inorderStart, rootIndex - 1, indexMap);
//创建右子树,与左子树类似。
TreeNode rightSubtree = buildTree(preorder, preorderEnd - rightNodes + 1, preorderEnd, inorder, rootIndex + 1, inorderEnd, indexMap);
//链接节点并返回
root.left = leftSubtree;
root.right = rightSubtree;
return root;
}
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/solution/mian-shi-ti-07-zhong-jian-er-cha-shu-by-leetcode-s/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。