标签:遍历 TreeNode 后序 int 二叉树 inorder postorder
问题描述:
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
示例输出:
输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3] 输出:[3,9,20,null,null,15,7]
示例 2: 输入:inorder = [-1], postorder = [-1] 输出:[-1]
思想:利用分治的思想来解决该题
结合后序遍历结果可知,后序遍历的最后一个结果就是根节点,所以说,我们只要每次拿着后序遍历最后元素去中序遍历结果找出该元素即可,
这样做的方法有个阻碍,就是我们在无法在方法外确定后序遍历数组的长度,方法里面无法像参数那样把数组长度传进去。
解决此处阻碍的方法就是将后序遍历数组逆序即可,接下来最后一个元素就是第一个元素了,下标直接从0开始即可。
具体解题步骤:
1.根据先序遍历,我们可以知道根节点就是给定数组的第一个元素pre[0],那么我们就可以在中序遍历中找出值等于pre[0]的位置,该位置的前半部分就是左子树,右半部分就是右子树,
2.重复1,直到遍历完,只不过此处先构造右孩子,再构造左孩子。(这样做的原因是后序遍历先输出左孩子结点再右孩子结点再根结点)
3.返回root结点
代码如下:
/** * 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 { public int preIndex = 0; public TreeNode buildTree(int[] inorder, int[] postorder ) { if(postorder == null || inorder == null) return null; postorder = rev(postorder); return creatTree(inorder,postorder,0,inorder.length-1); } public TreeNode creatTree(int[] inorder,int[] postorder,int start,int end){ if(start > end) return null; TreeNode root = new TreeNode(postorder[preIndex]); int index = find(inorder,start,end,postorder[preIndex]); if(index == -1) return null; preIndex++; root.right = creatTree(inorder,postorder,index+1,end); root.left = creatTree(inorder,postorder,start,index-1); return root; } public int find(int[] inorder, int start,int end,int target){ while(start <= end){ if(inorder[start] == target) return start; start++; } return -1; } public static int[] rev(int[] arr){ int i = 0; int j = arr.length-1; while(i<=j){ int tmp = arr[i]; arr[i++] = arr[j]; arr[j--] = tmp; } return arr; } }
标签:遍历,TreeNode,后序,int,二叉树,inorder,postorder 来源: https://www.cnblogs.com/du001011/p/15945283.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。