代码随想录 105.从前序与中序遍历构造二叉树

思路:
(1)本题思路同106. 从中序与后序遍历构造二叉树相同,只不过是从找后序遍历的最后一个元素在中序遍历中的位置改为找前序遍历的第一个元素在中序遍历中的位置。
(2)在本题中,需先切割中序数组,后切割后序数组。
知识点:
1.前序和中序、后序和中序遍历都可以唯一确定一棵二叉树,但前序和后序无法唯一确定一棵二叉树。
2.本题与上一题都是构造二叉树,题目难度和代码实现会略难于之前的遍历二叉树,需好好学习。
附代码:
class Solution {Map<Integer,Integer> map;public TreeNode buildTree(int[] preorder, int[] inorder) {map = new HashMap<>();for(int i = 0;i<inorder.length;i++){map.put(inorder[i],i); //用map保存中序序列的数值对应位置}return findNode(preorder,0,preorder.length,inorder,0,inorder.length);//前闭后开规则}public TreeNode findNode(int[] preorder,int preBegin,int preEnd,int[] inorder,int inBegin,int inEnd){if(preBegin >= preEnd || inBegin >= inEnd){//不满足前闭后开,说明没有元素,返回空树return null;}int rootIndex = map.get(preorder[preBegin]); //找到前序遍历的第一个节点在中序遍历中的位置TreeNode root = new TreeNode(inorder[rootIndex]); //构造节点int lenOfLeft = rootIndex - inBegin; //保存中序左子树的个数,用于确定前序左子树的个数root.left = findNode(preorder,preBegin + 1,preBegin + lenOfLeft + 1,inorder,inBegin,rootIndex);root.right = findNode(preorder,preBegin + lenOfLeft +1,preEnd,inorder,rootIndex + 1,inEnd);return root;}
}
