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 }
  • 相关阅读:
    授权中的with admin option和with grant option
    CentOS6.2(64bit)下mysql5.6.16主从同步配置
    linux zip命令
    从模版中找到控件的方法和找到样式的方法
    WPF 在事件中绑定命令(不可以在模版中绑定命令)
    WPF: ShowDialog() 切换到其他应用窗口后,再切换回来无法让子窗口总在最上方
    TreeViewItem实现整行选中 (两种用法)
    BitmapImage 读取内存流和显示图片
    IsKeyboardFocused -- 键盘焦点
    WPF中的imagesource 和内存图片的处理
  • 原文地址:https://www.cnblogs.com/linliquan/p/10584967.html
Copyright © 2011-2022 走看看