zoukankan      html  css  js  c++  java
  • 剑指offer【04】 重建二叉树(java)

    题目:重建二叉树

    考点:树

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

    法一:递归法1,比较简洁易懂

     1 import java.util.*;
     2 /**
     3  * Definition for binary tree
     4  * public class TreeNode {
     5  *     int val;
     6  *     TreeNode left;
     7  *     TreeNode right;
     8  *     TreeNode(int x) { val = x; }
     9  * }
    10  */
    11 import java.util.Arrays;
    12 public class Solution {
    13     public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
    14         if(pre.length == 0 || in.length == 0){
    15             return null;
    16         }
    17         //前序:{1,2,4,7,3,5,6,8} 中序:{4,7,2,1,5,3,8,6}
    18         TreeNode node = new TreeNode(pre[0]);
    19         for(int i = 0; i < in.length; i++){
    20             if(pre[0] == in[i]){
    21                 //注意边界问题
    22                 //如i=3时,in[i]==pre[0],则中序{4,7,2,1,5,3,8,6}分为左边{4,7,2}和右边{5,3,8,6}。所以left的前序数组只需拷贝从[1,i+1)即可。
    23                 node.left = this.reConstructBinaryTree(Arrays.copyOfRange(pre,1,i+1),Arrays.copyOfRange(in,0,i));
    24                 node.right = this.reConstructBinaryTree(Arrays.copyOfRange(pre,i+1,pre.length),Arrays.copyOfRange(in,i+1,in.length));
    25             }
    26         }
    27         return node;
    28     }
    29 }

    Arrays提供了一个copyOfRange方法进行数组复制。
    Arrays.copyOfRange()的格式如下:

    1 copyOfRange(int[] original, int from, int to)
    1. 第一个参数表示源数组

    2. 第二个参数表示开始位置(取得到)

    3. 第三个参数表示结束位置(取不到)

    法二:递归法2

     1 import java.util.*;
     2 /**
     3  * Definition for binary tree
     4  * public class TreeNode {
     5  *     int val;
     6  *     TreeNode left;
     7  *     TreeNode right;
     8  *     TreeNode(int x) { val = x; }
     9  * }
    10  */
    11 import java.util.Arrays;
    12 public class Solution {
    13     public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
    14         TreeNode node = reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);
    15         return node;
    16     }
    17     //重载
    18     private TreeNode reConstructBinaryTree(int [] pre,int startPre,int endPre,int [] in,int startIn,int endIn){  
    19         //判断数组是否为空
    20         if(startPre > endPre || startIn > endIn){
    21             return null;
    22         }
    23         TreeNode node = new TreeNode(pre[startPre]);
    24         for(int i = startIn; i <= endIn; i++){
    25             if(pre[startPre] == in[i]){
    26                  //注意边界
    27                  node.left = reConstructBinaryTree(pre,startPre+1,startPre+i-startIn,in,startIn,i-1);
    28                  node.right = reConstructBinaryTree(pre,i-startIn+startPre+1,endPre,in,i+1,endIn);
    29                  break;
    30             }
    31            
    32         }
    33         return node;
    34     }
    35 }
  • 相关阅读:
    结构和联合
    字符串、字符和字节
    数组
    函数
    指针
    操作符和表达式
    语句
    数据
    TinyXML2 使用
    是否忘记了向源中添加“#include "StdAfx.h"”?
  • 原文地址:https://www.cnblogs.com/linliquan/p/10584967.html
Copyright © 2011-2022 走看看