leetcode:105. 从前序与中序遍历序列构造二叉树(java)

本文介绍了一种根据前序与中序遍历序列构造二叉树的方法,通过递归深度优先搜索算法实现,适用于没有重复元素的树结构。
package LeetCode;

import java.util.ArrayList;
import java.util.List;

/*
105. 从前序与中序遍历序列构造二叉树
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
    3
   / \
  9  20
    /  \
   15   7
 */
public class BuildTree {

    public TreeNode buildTree(int[] preorder, int[] inorder) {

        return dfs(0, preorder.length - 1, 0, inorder.length - 1, preorder, inorder);
    }

    public TreeNode dfs(int ps, int pe, int is, int ie, int[] preorder, int[] inorder) {
        if (ps > pe) return null;
        TreeNode r = new TreeNode(preorder[ps]);
        int mid = -1;
        for (int i = 0; i <= ie; i++) {
            if (inorder[i] == preorder[ps]) {
                mid = i;
                break;
            }
        }
        if (mid == -1) return null;
        //左子树的个数
        //前序遍历[ps][ps+1...ps+c][ps+c+1...pe]
        //后序遍历[is...mid-1][mid][mid+1...ie]
        int c = mid - is;
        r.left = dfs(ps + 1, ps + c, is, mid - 1, preorder, inorder);
        r.right = dfs(ps + c + 1, pe, mid + 1, ie, preorder, inorder);
        return r;
    }
}

 

### 力扣推荐顺序与学习路径 对于初学者或者希望系统化提升算法能力的学习者来说,力扣是一个非常优秀的平台。以下是基于已有资料[^1]以及常见学习方法总结的策略。 #### 一、整体学习路径 根据不同的需求和目标,可以选择两种主要的学习方式: 1. **按推荐顺序逐一** 这种方式适合初次接触算法或准备面试的人群。通过逐步完成题目,可以全面掌握常见的数据结构算法知识点。具体可以从简单的热身开始,逐渐过渡到更复杂的题目[^3]。 2. **针对薄弱环节专项训练** 如果已经具备一定的基础,则可以根据自己的不足之处集中练习特定类型的题目。例如,在排序算法方面,可以通过专门练习冒泡排序、选择排序、插入排序等经典算法来巩固理解[^2]。 --- #### 二、具体的题目分类及建议 ##### 数据结构部分 1. **数组** - **核心概念**: 数组是最基本的数据存储形式之一。 - **典型题目**: - `二分查找` (热身) ```python def binary_search(nums, target): left, right = 0, len(nums) - 1 while left <= right: mid = (left + right) // 2 if nums[mid] == target: return mid elif nums[mid] < target: left = mid + 1 else: right = mid - 1 return -1 ``` - `移除元素` 和 `有序数组的平方`(双指针技巧)[^3] 2. **链表** - **核心概念**: 链表是一种动态分配内存的空间管理技术。 - **典型题目**: - `移除链表元素`: 使用虚拟头结点简化边界条件处理。 - `反转链表`: 创建辅助节点帮助调整指向关系。 ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def reverseList(head: ListNode) -> ListNode: prev = None curr = head while curr is not None: temp_next = curr.next curr.next = prev prev = curr curr = temp_next return prev ``` 3. **字符串** - 字符串类问是考察编码能力和思维灵活性的重要领域。 - 如比较两个单词是否由相同字符构成。 4. **树/图** - 树形结构及其变体(如二叉搜索树BST),还有广度优先搜索(BFS)/深度优先搜索(DFS)都是高频考点。 --- ##### 算法思想部分 1. **排序算法** - 经典排序包括但不限于冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序等。 2. **递归** - 许多问都可以借助递归来优雅地求解,比如汉诺塔游戏、斐波那契数列计算等问。 3. **动态规划(DP)** - DP适用于那些具有重叠子问性质的任务,像背包问、最长公共子序列(LCS)等都属于此类范畴。 4. **贪心算法** - 当局部最优能够带来全局最佳效果时适用此方法,典型案例有活动安排问等等。 5. **分治法** - 将原问划分为若干个小规模相似子问分别加以解决再综合起来得到最终解答的方法论。 6. **其他高级主** - 包括但不限于回溯法、位运算应用实例分析等内容。 --- ### 总结 综上所述,无论是循序渐进还是有的放矢,合理规划好每日任务量,并坚持下去才是成功的关键所在!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值