剑指Offer:重建二叉树【7】
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
分析
我们首先要明白前序和中序构建二叉树的流程,流程理解了才是解题的关键:
如上图所示,前序遍历可以找到头结点,然后在中序遍历中找到它的位置
比如,1的位置为i,那么startIn~i-1就是它的左子树的中序遍历,startPre+1~startPre+i-startIn就是它的左子树的前序遍历。
那么,右子树的的中序遍历是 i+1~endIn,startPre+i-startIn+1~endPre是先序。
有了这一点以后,我们根据这个分解问题,发现他可以被对递归执行。每次的先序遍历的startPre都是头节点,然后中序帮助划分,再拿先序的startPre作为头结点,一直继续下去,就可以构建出完整的二叉树。
Java实现代码
package tree; public class BuildTree { public TreeNode reConstructBinaryTree(int [] pre,int [] in) { TreeNode root=ConstructCore(pre,0,pre.length-1,in,0,in.length-1); return root; } public TreeNode ConstructCore(int[] pre,int startPre,int endPre,int[] in,int startIn,int endIn) { if(startPre>endPre||startIn>endIn) return null; TreeNode node = new TreeNode(pre[startPre]); for(int i=startIn;i<=endIn;i++) { if(in[i]==pre[startPre]) { node.left = ConstructCore(pre,startPre+1,startPre+i-startIn,in,startIn,i-1); node.right =ConstructCore(pre,startPre+i-startIn+1,endPre,in,i+1,endIn); break; } } return node; } } class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } }
原文地址:https://www.cnblogs.com/MrSaver/p/9205436.html
时间: 2024-12-13 20:52:42