算法:二叉树的重建
2017-07-12 18:37
246 查看
首先前序遍历特性,根节点在第一个,然后后面是左子树,然后是右子树。
而中序遍历,首先出现的是左子树,然后是根节点,然后是右子树。
然后就可以用递归方法,将前序遍历的第一个数值和中序遍历比较,找到中序遍历中的根节点。中序遍历中的该节点左边为左子树,右边为右子树。再用同样的方法找到左右子树的根节点,依次递归
而中序遍历,首先出现的是左子树,然后是根节点,然后是右子树。
然后就可以用递归方法,将前序遍历的第一个数值和中序遍历比较,找到中序遍历中的根节点。中序遍历中的该节点左边为左子树,右边为右子树。再用同样的方法找到左右子树的根节点,依次递归
/** * 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) { TreeNode root=reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1); return root; } /* * * @param PreOrder * 前序遍历序列 * @param startPreIndex * 前序序列开始位置 * @param endPreIndex * 前序序列结束位置 * @param InOrder * 中序遍历序列 * @param startInIndex * 中序序列开始位置 * @param endInIndex * 中序序列结束位置 */ private TreeNode reConstructBinaryTree(int[] pre,int startPre,int endPre,int[] in,int startIn,int endIn) { if(startPre>endPre||startIn>endIn){ return null; } TreeNode root=new TreeNode(pre[startPre]); for(int i=startIn;i<=endIn;i++){ if(in[i]==pre[startPre]){//中序遍历等于前序遍历的第一个时,这个点作为一个根节点,左边的是左树,右边的右树 root.left=reConstructBinaryTree( pre,startPre+1,startPre+i-startIn,in,startIn,i-1); //递归 // 前序遍历中:下一个的左树的根节点是前序遍历数组的第二个,结束位置是(i-中序开始+前序开始) // 中序遍历中:下个左树的根节点是开始,结束是i-1 root.right=reConstructBinaryTree( pre,i-startIn+startPre+1,endPre,in,i+1,endIn); //前序遍历中: 右树的根节点是前序遍历数组的第(i+1-中序开始+前序开始)结束位置是前序结尾 //中序遍历中:右树是i+1----结尾 } 4000 } return root; } }
public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } }
相关文章推荐
- 算法题17 重建二叉树
- [算法学习]输入遍历重建二叉树
- 算法练习四:重建二叉树
- 算法-重建二叉树
- 二叉树的重建,遍历,求深度算法
- 笔试算法题(36):寻找一棵二叉树中最远节点的距离 & 根据二叉树的前序和后序遍历重建二叉树
- 算法-重建二叉树
- 由二叉树重建所引出的算法
- 重拾算法之剑指Offier——重建二叉树
- 算法题17 重建二叉树
- 算法题目-二叉树的重建
- 【算法入门经典】6.3.3 二叉树重建【双十一大礼包】
- 算法题目---重建二叉树
- 面试算法(五)重建二叉树
- 每天一道算法题——重建二叉树
- [剑指offer]算法4 重建二叉树
- 跟我一起学算法系列6---重建二叉树
- 【算法题】重建二叉树
- 【数据结构与算法】重建二叉树
- 剑指offer-算法题练习:part4 重建二叉树