题目地址
https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/submissions/
思路
构建的思路就是先知道根是谁,然后先构建左边,再构建右边
先把中序每个节点都放到map中 这样可以方便的知道每个节点的下标
把中序遍历结果放到数组中是因为从前序遍历结果第一个就能知道根节点,中序遍历中根节点的左边就是二叉树左边的节点,
右边的数据就是二叉树的右边的节点,然后再次递归的创建即可
代码 (就是对官方的答案做个解析 菜的一批 后面自己再重新实现一次吧。。。)
/**
* @Auther: wwh
* @Date: 2020-03-12 22:55
* @Description
*/
class BuildTree {
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);
//左边叶子节点的个数
int leftNodeSize = rootIndex - inorderStart;
//右边叶子节点的个数
int rightNodeSize = inorderEnd - rootIndex;
TreeNode leftSubtree = buildTree(preorder, preorderStart + 1, preorderStart + leftNodeSize, inorder, inorderStart, rootIndex - 1, indexMap);
TreeNode rightSubtree = buildTree(preorder, preorderEnd - rightNodeSize + 1, preorderEnd, inorder, rootIndex + 1, inorderEnd, indexMap);
root.left = leftSubtree;
root.right = rightSubtree;
return root;
}
}