剑指7重建二叉树

这篇博客介绍了如何通过给定的二叉树前序和中序遍历序列,利用递归算法重建二叉树。文章详细阐述了递归过程中的关键步骤,包括确定根节点、查找根节点在中序遍历中的位置以及构建左右子树。解题思路指出,时间复杂度和空间复杂度均为O(n),其中n为遍历序列的长度。
摘要由CSDN通过智能技术生成

题目描述:
给定节点数为 n 二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,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}
示例2
输入:[1],[1]
返回值:{1}
示例3
输入:[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]
返回值:{1,2,5,3,4,6,7}

解题思路:
用递归实现,假设最后一步,root的左右子树已经重建好了,只考虑将root的左右子树安装上去即可,根据前序遍历的性质,root元素前面都是root的左子树,后面都是root的右子树,那么只需要确定中序遍历中root的位置,就可以确定左右子树的范围。
时间复杂度:O(n)
空间复杂度:O(n)

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

import java.util.Arrays;
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        //数组长度为零,返回空
        if(pre.length == 0 ){
            return null;
        }
        int rootVal = pre[0];
        
        //数组长度为1的时候返回根节点
        
        if(pre.length == 1){
            return new TreeNode(rootVal);
        }
        
        //找到root所在位置,确定好谦虚和中序中左子树和右子树序列的范围
         
        TreeNode root = new TreeNode(rootVal);
        int rootIndex = 0;
        for(int i = 0;i<in.length;i++){
            if(rootVal == in[i]){
                rootIndex = i;
                break;
            }
        }
        
        //递归,假设root的左右子树已构建完毕,那么只要将左右子树安到root左右即可
        //这里注意Arrays.copyOfRange(int[],start,end)是[)的区间
        root.left = reConstructBinaryTree(Arrays.copyOfRange(pre,1,rootIndex+1),Arrays.copyOfRange(in,0,rootIndex));
        root.right = reConstructBinaryTree(Arrays.copyOfRange(pre,rootIndex+1,pre.length),Arrays.copyOfRange(in,rootIndex+1,in.length));
    return root;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值