重建二叉树
来源:互联网 发布:微信多帐号登录软件 编辑:程序博客网 时间:2024/05/16 02:42
题目
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路
(1)由前序遍历结果确定根结点
(2)查找根结点在中序遍历序列中的位置,由此确定左子树和右子树,即中序遍历中根结点左侧的序列为左子树序列,右侧为右子树序列
(3)根据以上方式查找每个子树的根结点,重建左右子树,此步骤通过递归实现
实现
class TreeNode{ int val; TreeNode left; TreeNode right; TreeNode(int x){ this.val=x; }}public class ConstructBinaryTree{ public TreeNode reConstructBinaryTree(int[] preOrder,int[] inOrder){ return constructCore(preOrder,0,preOrder.length-1,inOrder,0,inOrder.length-1); } //find root according to preOrder and inOrder private TreeNode constructCore(int[] preOrder,int startPreOrder,int endPreOrder,int[] inOrder,int startInOrder,int endInorder){ int rootValue=preOrder[startPreOrder]; //find rootValue according to preOrder TreeNode rootNode=new TreeNode(rootValue); //create rootNode rootNode.left = null; rootNode.right = null; //only one node,return rootNode if(startPreOrder==endPreOrder){ if(startInOrder==endInorder && preOrder[startPreOrder]==inOrder[startInOrder]){ return rootNode; } } //find the order of rootNode in inOrder int rootOfInOrder = startInOrder; while (rootOfInOrder <= endInorder && inOrder[rootOfInOrder] != rootValue){ rootOfInOrder++; } //deal with exception if(rootOfInOrder == endInorder && inOrder[rootOfInOrder] != rootValue){ return null; } //calculate the length of leftTree int leftSubTreeLength = rootOfInOrder - startInOrder; //calculate the Subscript of leftSubTree's last node int leftIndexOfPreOrderEnd = startPreOrder + leftSubTreeLength; //reConstruct leftSubTree if(leftSubTreeLength>0){ rootNode.left = constructCore(preOrder,startPreOrder+1,leftIndexOfPreOrderEnd,inOrder,startInOrder,rootOfInOrder-1); } //reConstruct rightSubTree if(leftSubTreeLength < endPreOrder - startPreOrder){ rootNode.right = constructCore(preOrder,leftIndexOfPreOrderEnd+1,endPreOrder,inOrder,rootOfInOrder+1,endInorder); } return rootNode; } //main function for test public static void main(String[] args) { int[] pre = {1,2,4,7,3,5,6,8}; int[] in = {4,7,2,1,5,3,8,6}; TreeNode root=new ConstructBinaryTree().reConstructBinaryTree(pre,in); System.out.println(root); }}
阅读全文
0 0
- 3.9重建二叉树
- 重建二叉树
- 二叉树重建
- 二叉树重建
- 二叉树的重建
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 二叉树重建
- 二叉树重建
- 重建二叉树
- 重建二叉树
- 重建二叉树
- ANR机制以及问题分析
- 游标的使用
- java I/O系统(6)-内存映射文件
- n皇后问题细分
- 【MySQL集群】——在Windows环境下配置MySQL集群
- 重建二叉树
- 机器学习实战——python实现SOM神经网络聚类算法
- set容器
- background 渐变
- JAVA实现RSA加密,非对称加密算法
- PHP与微信小程序的纠葛---2
- hdoj1014(输出格式)
- loadrunner之检查点——web_reg_find()函数
- Maven学习总结(21)——Maven坐标详解