zoukankan      html  css  js  c++  java
  • 【LeetCode106】Construct Binary Tree from Inorder and Postorder Traversal★★

    1.题目

    2.思路

       思路和LeetCode105类似,见上篇。

    3.java代码

     1 //测试
     2 public class BuildTreeUsingInorderAndPostorder {
     3      public static void main(String[] args) {
     4             int[] postSort={7,4,2,5,8,6,3,1};
     5             int[] inSort={4,7,2,1,5,3,8,6};
     6             System.out.println(new Solution2().buildTree(postSort, inSort));
     7         }
     8 }
     9 //利用中序和后序重建二叉树
    10 class Solution2 {
    11     public TreeNode buildTree(int[] inorder, int[] postorder) {
    12         //参数校验
    13         if(postorder==null||inorder==null||postorder.length!=inorder.length||postorder.length==0) 
    14             return null;
    15         return buildTreeCore(inorder,0,inorder.length-1,postorder,0,postorder.length-1);
    16     }
    17     /**
    18      * 构建二叉树,数据输入的正确性由输入数据自己保证
    19      *
    20      * @param postorder                    后序遍历的结果
    21      * @param startPostorder  后序遍历的开始位置
    22      * @param endPostorder    后序遍历的结束位置
    23      * @param inorder        中序遍历的结果
    24      * @param startInorder   中序遍历的开始位置
    25      * @param endInorder     中序遍历的结束位置
    26      * @return 二叉树的根结点
    27      */
    28     private TreeNode buildTreeCore(int[] inorder,int startInorder, int endInorder,
    29             int[] postorder, int startPostorder, int endPostorder) {
    30         // 只有一个元素时直接返回该节点,这也是递归结束的出口标志
    31         if(startPostorder==endPostorder){
    32             return new TreeNode(postorder[endPostorder]);
    33         }else{
    34             // 记录根结点的在中序遍历中的位置
    35             int rootIn=startInorder;
    36             for(int i=startInorder;i<=endInorder;i++){
    37                 if(inorder[i]==postorder[endPostorder]){
    38                     rootIn=i;
    39                     break;
    40                 }
    41             }
    42             // 创建根结点
    43             TreeNode root=new TreeNode(inorder[rootIn]);
    44              // 左子树的结点个数
    45             int leftLength=rootIn-startInorder;
    46             if(leftLength>0){
    47                 // startPostorder, startPostorder+leftLength-1:左子树在后序序列中的起始和结束位置
    48                 root.left=buildTreeCore(inorder, startInorder, rootIn-1, postorder, startPostorder, startPostorder+leftLength-1);
    49             }
    50             // 右子树的结点个数
    51             int rightLength=endInorder-rootIn;
    52             if(rightLength>0){
    53                 // startPostorder+leftLength, endPostorder:左子树在后序序列中的起始和结束位置
    54                 root.right=buildTreeCore(inorder, rootIn+1, endInorder, postorder, startPostorder+leftLength, endPostorder-1);
    55             }
    56             return root;
    57         }
    58     }
    59 }
    60 //二叉树节点定义
    61 class TreeNode {
    62      int val;
    63      TreeNode left;
    64      TreeNode right;
    65      TreeNode(int x) { val = x; }
    66 }
  • 相关阅读:
    linux-2.6.32在mini2440开发板上移植(1)之移植Nand驱动并修改分区信息
    编程错误
    汇编语言程序设计读书笔记(4)- 程序设计基础之一
    汇编语言程序设计读书笔记(3)- 程序范例
    汇编语言程序设计读书笔记(2)- 相关工具64位系统篇
    将博客搬至CSDN
    汇编语言程序设计读书笔记(1)- 相关工具
    CentOS v6.4 64位系统编译linux3.0.8内核错误的解决
    用J-LINK烧写Bootloader到ARM开发板的Nand Flash
    Keil MDK使用J-LINK分别在Sram,Nor Flash以及Sdram中调试代码的原理和方法
  • 原文地址:https://www.cnblogs.com/zhangboy/p/6558563.html
Copyright © 2011-2022 走看看