力扣——从中序和后序遍历序列构造二叉树

本文介绍了一种根据中序遍历与后序遍历序列构造二叉树的方法,通过深度优先搜索算法实现,避免了树中重复元素的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根据一棵树的中序遍历与后序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode buildTree(int[] arr, int[] brr) {
        return DFS(brr,0,arr,0,arr.length);
    }
    TreeNode DFS(int []brr,int i,int []arr ,int j, int n){
        if(n==0)
        return null;
        TreeNode now =new TreeNode(brr[i+n-1]);
        int count=0;
        while(count<n){
            if(arr[j+count]==brr[n-1+i])
                break;
            count ++;
        }
        now.left=DFS(brr,i,arr,j,count);
        now.right=DFS(brr,i+count,arr,j+count+1,n-count-1);
        return now;
    }
}

 

转载于:https://www.cnblogs.com/JAYPARK/p/10679804.html

### 常见的Java LeetCode题目类型及解题思路 #### 题目类型概述 LeetCode上的Java题目涵盖了多种算法数据结构的应用场景,主要包括数组操作、字符串处理、链表管理、树遍历以及动态规划等问题。以下是几种常见类型的描述: - **数组矩阵**:涉及查找最大子序列、旋转图像等任务。 - **字符串匹配编辑距离**:如判断回文串、计算两个字符串之间的最小编辑次数。 - **链表操作**:反转单向/双向链表节点顺或者检测环形结构的存在否。 - **二叉树及相关概念**:前、中后序遍历;平衡判定;路径总求解等等。 #### 示例一:两数之 (Two Sum) 给定一个整型数组`nums` 目标值 `target`, 找到数组中的两个不同位置 i,j 的元素使得它们相加等于 target, 返回这两个索引[i,j]. ```java public int[] twoSum(int[] nums, int target){ Map<Integer,Integer> map=new HashMap<>(); for(int i=0;i<nums.length;i++){ if(map.containsKey(target - nums[i])){ return new int[]{map.get(target - nums[i]),i}; } map.put(nums[i],i); } throw new IllegalArgumentException("No solution"); } ``` 此方法利用哈希映射来存储已经访问过的数值及其对应的下标,在后续迭代过程中快速定位是否存在满足条件的一对数字[^1]。 #### 示例二:最长公共前缀(Longest Common Prefix) 编写函数找出多个输入字符串列表中最长共有的起始部分。如果不存在这样的共同开头,则返回空字符"". ```java public String longestCommonPrefix(String[] strs) { if(strs==null||strs.length==0)return ""; String prefix=strs[0]; for(int i=1;i<strs.length;i++) { while(strs[i].indexOf(prefix)!=0){ prefix=prefix.substring(0,prefix.length()-1); if(prefix.isEmpty())return ""; } } return prefix; } ``` 通过逐步缩短候选词长度直至找到所有单词都共享的部分作为最终结果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值