zoukankan      html  css  js  c++  java
  • 剑指offer系列4---重建二叉树

    【题目】

    * 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
    * 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
    * 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

     1 package com.exe1.offer;
     2 
     3 /**
     4  * 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
     5  * 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
     6  * 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
     7  * @author WGS
     8  *
     9  */
    10 public class ConstructBinaryTree {
    11     //定义一个树
    12     public class TreeNode{
    13         int val;
    14         TreeNode left;
    15         TreeNode right;
    16         
    17         TreeNode(int n){
    18             val=n;
    19         }
    20     }
    21     //新建一个方法,返回重建的二叉
    22     public TreeNode returnConstructBinaryTree(int[] preTree,int[] inTree){        
    23         return constructCore(preTree,0,preTree.length-1,inTree,0,inTree.length-1);
    24     }
    25     
    26     public TreeNode constructCore(int[] preTree,int startPreOrder,int endPreOrder,int[] inTree,int startInOrder,int endInOrder ){
    27         //根据前序遍历序列得到根节点的值
    28         int rootValue=preTree[startPreOrder];
    29         //创建一个只有根结点的二叉树
    30         TreeNode rootNode=new TreeNode(rootValue);
    31         rootNode.left=null;
    32         rootNode.right=null;
    33         //只有一个结点,那么该结点即使根结点,直接返回
    34         if(startPreOrder==endPreOrder){
    35             if(startInOrder==endInOrder&&preTree[startPreOrder]==inTree[startInOrder]){
    36                 return rootNode;
    37             }
    38         }
    39         
    40         //根据中序遍历,从中序遍历序列起点开始搜寻根结点位置
    41         int rootOfInTree=startInOrder;
    42         while(rootOfInTree<=endInOrder&&inTree[rootOfInTree]!=rootValue){
    43             rootOfInTree++;
    44         }
    45         
    46         //异常处理:中序序列中找不到这样的根结点
    47         while(rootOfInTree==endInOrder&&inTree[rootOfInTree]!=rootValue){
    48             return null;
    49         }
    50         
    51         //计算左子树的长度
    52         int leftSubTreeLen=rootOfInTree-startInOrder;
    53          //根据左子树的长度计算前序遍历结果中左子树的最后一个结点的下标
    54         int leftInOrderOfPreOrderEnd=startPreOrder+leftSubTreeLen;
    55         
    56         //重建左子树
    57         if(leftSubTreeLen>0){
    58             rootNode.left=constructCore(preTree,startPreOrder+1,leftInOrderOfPreOrderEnd,inTree,startInOrder,rootOfInTree-1);
    59         }
    60         //重建右子树
    61         if(leftSubTreeLen<endPreOrder-startPreOrder){
    62             rootNode.right=constructCore(preTree,leftInOrderOfPreOrderEnd-1,endPreOrder,inTree,rootOfInTree+1,endInOrder);
    63         }
    64         return rootNode;
    65         
    66     }
    67     
    68     public static void main(String [] args){
    69         int[] preTree={1,2,4,7,3,5,6,8};
    70         int[] inTree={4,7,2,1,5,3,8,6};
    71         TreeNode root=new ConstructBinaryTree().returnConstructBinaryTree(preTree, inTree);
    72         System.out.println(root);//返回二叉树,此处无法打印,该怎么遍历还不会。
    73     }
    74     
    75 }
  • 相关阅读:
    超详细的 Vagrant 上手指南
    简单聊聊 Ironic
    什么是裸金属
    使用 minikube 快速上手 Kubernetes | v1.7.3
    来看看你对Python变量理解到位了没有
    python HelloWorld 的 4 种姿势,你知道几种
    Windows 系统安装 Python 3.8 详解
    myeclipse2017下载安装与破解详细教程
    eclipse中tomcat的add and Remove找不到项目
    cmd中查看MySQL数据库表数据及结构
  • 原文地址:https://www.cnblogs.com/noaman/p/5372273.html
Copyright © 2011-2022 走看看