105 从前序与中序遍历序列构造二叉树

这篇博客主要介绍了如何通过前序遍历和中序遍历序列来构建二叉树。两种不同的实现方式被提出,一种基于递归,另一种利用哈希表提高效率。这两种方法的时间复杂度均为O(n),空间复杂度为O(n)。文章深入探讨了如何找到根节点并构建左右子树,为理解二叉树的构造提供了清晰的思路。
摘要由CSDN通过智能技术生成

105 从前序与中序遍历序列构造二叉树

在这里插入图片描述
在这里插入图片描述

01

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
            return subTree(preorder,inorder,0,inorder.length-1,0,preorder.length-1);
    }
    public TreeNode subTree(int[] pre,int[] vin,int start,int end,int k,int p_end){
        if(k>p_end || start>end){
            return null;
        }

        TreeNode root=new TreeNode(pre[k]);

        int i=start;
        for(;i<=end;i++){
            if(vin[i]==pre[k]){
                break;
            }
        }
        //左子树
        if(i==start){
            root.left=null;
        }else{
            root.left=subTree(pre,vin,start,i-1,k+1,k+i-start);
        }
        //右子树
        if(i==end){
            root.right=null;
        }else{
            root.right=subTree(pre,vin,i+1,end,k+i-start+1,p_end);
        }
        return root;
    }
}

在这里插入图片描述

hashmap

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
   private Map<Integer,Integer> map;
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        map=new HashMap<>();
        for (int i=0;i<inorder.length;i++){
            map.put(inorder[i],i);
        }
        return subTree(preorder,inorder,0,inorder.length-1,0,preorder.length-1);
    }
    public TreeNode subTree(int[] pre,int[] vin,int start,int end,int k,int p_end){
        if(k>p_end || start>end){
            return null;
        }

        TreeNode root=new TreeNode(pre[k]);

        int i=map.get(pre[k]);
//        for(;i<=end;i++){
//            if(vin[i]==pre[k]){
//                break;
//            }
//        }
        //左子树
        if(i==start){
            root.left=null;
        }else{
            root.left=subTree(pre,vin,start,i-1,k+1,k+i-start);
        }
        //右子树
        if(i==end){
            root.right=null;
        }else{
            root.right=subTree(pre,vin,i+1,end,k+i-start+1,p_end);
        }
        return root;
    }

}

在这里插入图片描述
时间复杂度 O ( n ) O(n) O(n) n n n是树中的节点个数。
空间复杂度 O ( n ) O(n) O(n),哈希表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值