剑指Offer-07 重建二叉树的两种方法

欢迎来到剑指offer好题精选专栏,一起学习,一起进步

题目信息:

给定某二叉树的前序遍历和中序遍历,请重建出该二叉树并返回它的头结点。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。

在这里插入图片描述
提示:
1.0 <= pre.length <= 2000
2.vin.length == pre.length
3.-10000 <= pre[i], vin[i] <= 10000
4.pre 和 vin 均无重复元素
5.vin出现的元素均出现在 pre里
6.只需要返回根结点,系统会自动输出整颗树做答案对比

示例1:

输入: [1,2,4,7,3,5,6,8],[4,7,2,1,5,3,8,6]
返回值: {1,2,3,4,#,5,6,#,7,#,#,8}
说明: 返回根节点,系统会输出整颗二叉树对比结果

解题思路:

1、首先由前序遍历的根节点找到中序遍历的下标位置,以此分割左树和右树,在递归至只剩一个节点。

2、和方法一类似,也是分割左右树,只不过这次是用数组拷贝的方法解决。

代码如下:
方法1:

class  Solution{
    public int prindex=0;
    public TreeNode buildTreeChild(int []preorder,int []inorder,int inbegin,int inend){
    if(inbegin>inend){
        return  null;
    }
    TreeNode root=new TreeNode(preorder[prindex]);
    int rootIndex=findIndex(inorder, inbegin, inend, preorder[prindex]);
    prindex++;
    root.left=buildTreeChild(preorder, inorder, inbegin, rootIndex-1);
    root.right=buildTreeChild(preorder, inorder, rootIndex+1, inend);
    return  root;

    }
    public int findIndex(int []inorder,int inbegin,int inend,int key){
        for (int i = inbegin; i <=inend ; i++) {
            if(inorder[i]==key){
                return  i;
            }
        }
        return  -1;
    }
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(preorder==null || inorder==null){
            return  null;
        }
      return  buildTreeChild(preorder, inorder, 0, inorder.length-1);
    }
}

方法2:

import java.util.*;
public class Solution {
  
    public TreeNode reConstructBinaryTree(int [] pre,int [] vin) {
  if(pre.length==0){
      return null;
  }
        int rootVal=pre[0];
      
        //找root节点位置
        TreeNode root=new TreeNode(rootVal);
        int rootIndex=0;
        for(int i=0;i<vin.length;i++){
            if(rootVal==vin[i]){
                rootIndex=i;
                break;
            }
        }
        root.left=reConstructBinaryTree(Arrays.copyOfRange(pre,1,rootIndex+1),Arrays.copyOfRange(vin,0,rootIndex));
        root.right = reConstructBinaryTree(Arrays.copyOfRange(pre,rootIndex+1,pre.length),Arrays.copyOfRange(vin,rootIndex+1,vin.length));
        return root;
        
        
    }
}
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

见闻色霸气~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值