重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路:知道了二叉树的前序和中序的序列就可以使用递归的方法找出根节点和左右子树了。以题目为例,首先看前序序列1一定是根节点,然后找到1在中序序列中的位置,中序序列中1前面的是左子树,1后面的是右子树。这样就找出子问题来了。可以使用分治递归了。注意特殊传参和递归结束的条件。
实现代码:
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public TreeNode reConstructBinaryTree(int [] pre,int [] in) { if(pre == null || pre.length == 0 || in == null || in.length == 0 || pre.length != in.length) { return null; } return build(pre, 0, pre.length-1, in, 0, in.length-1); } public TreeNode build(int[] pre, int startPre, int endPre, int[] in, int startIn, int endIn) { TreeNode root = new TreeNode(pre[startPre]); if(startPre == endPre) return root; int rootPos = startIn; while(rootPos <= endIn && in[rootPos] != pre[startPre]) { rootPos ++; } int leftLength = rootPos - startIn; if(leftLength > 0) { //构造左子树 root.left = build(pre, startPre+1, startPre+leftLength, in, startIn, rootPos-1); } if(endIn - rootPos > 0) { //构造右子树 root.right = build(pre, startPre+leftLength+1, endPre, in, rootPos+1, endIn); } return root; } }
作者:Pickle
声明:对于转载分享我是没有意见的,出于对博客园社区和作者的尊重一定要保留原文地址哈。
致读者:坚持写博客不容易,写高质量博客更难,我也在不断的学习和进步,希望和所有同路人一道用技术来改变生活。觉得有点用就点个赞哈。