106.从中序与后序遍历序列构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树。
注意: 你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树:
思路:
首先,要确保树中没有重复元素的情况下进行。
后续是左右中,所以根节点一定是最后一个,通过明确的根节点去中序数组中进行切割左右子树位置。
不断递归这个过程即可找出一个唯一的树顺序。
1.判断后序遍历数组的是否为空,如果为空,直接返回。说明数组没有值,数组不存在。
2.找到后序数组的最后一个元素,作为根节点元素。
3.中序数组找到对应位置进行切割操作
4.切割中序数组。
5.根据中序数组切割后序数组
6.递归处理左右区间
class Solution { Map<Integer, Integer> map; // 方便根据数值查找位置 public TreeNode buildTree(int[] inorder, int[] postorder) { map = new HashMap<>(); for (int i = 0; i < inorder.length; i++) { // 用map保存中序序列的数值对应位置 map.put(inorder[i], i); } return findNode(inorder, 0, inorder.length, postorder,0, postorder.length); // 前闭后开 } public TreeNode findNode(int[] inorder, int inBegin, int inEnd, int[] postorder, int postBegin, int postEnd) { // 参数里的范围都是前闭后开 if (inBegin >= inEnd || postBegin >= postEnd) { // 不满足左闭右开,说明没有元素,返回空树 return null; } int rootIndex = map.get(postorder[postEnd - 1]); // 找到后序遍历的最后一个元素在中序遍历中的位置 TreeNode root = new TreeNode(inorder[rootIndex]); // 构造结点 int lenOfLeft = rootIndex - inBegin; // 保存中序左子树个数,用来确定后序数列的个数 root.left = findNode(inorder, inBegin, rootIndex, postorder, postBegin, postBegin + lenOfLeft); root.right = findNode(inorder, rootIndex + 1, inEnd, postorder, postBegin + lenOfLeft, postEnd - 1); return root; } }
标签:遍历,Day28,后序,int,代码,随想录,inorder,中序,postorder From: https://www.cnblogs.com/dwj-ngu/p/16916316.html