力扣树专题-3 树的重建 leetcode105 106 Java刷题笔记

听不少大佬建议过——力扣刷题要从树开始 !
因为可以建立起套路化的思路~ 另外就是锻炼好递归的思想
所以 我们从树开始~
本专题采用前面提到的 “兔系刷题法” 不求钻研多种解法 只求快速见题型快速刷题!

另外 力扣评论区里看见的——

树的题目写不出来,多背几个模版就行。

前中后序、广度深度遍历、路径和、深度,直径,这些全部背下来。

感觉很有道理!多背些多理解些套路嘛!
本专题的套路较为冷门 为 二叉树的重建 数据结构中的重要知识点
真绕啊!

本次的两道题比前几期的都要烧脑嗷
虽然是我们数据结构都学到过的东西
但是真正让你实现 你真的有思路嘛?

本专题体会!
有的题目
画图真的很重要!!!

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

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

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

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

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树——

    3
   / \
  9  20
    /  \
   15   7

解题思路

参考威威哥的题解 实在是太清晰啦!

分治法(Python 代码、Java 代码)

首先确定了使用分治法的思想进行解题

复习一下分治法的思想:把原问题拆解成若干个与原问题结构相同但规模更小的子问题,待子问题解决以后,原问题就得以解决,“归并排序”和“快速排序”都是分治法思想的应用,其中“归并排序”先无脑地“分”,在“合”的时候就麻烦一些;“快速排序”开始在 partition 上花了很多时间,即在“分”上使了很多劲,然后就递归处理下去就好了,没有在“合”上再花时间。

作者:liweiwei1419
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/solution/qian-xu-bian-li-python-dai-ma-java-dai-ma-by-liwei/
这段感觉说得实在太棒了!

把之前的知识都串起来了!

疯狂打call!!

在本题中 首先要明确:

前序遍历数组的第一个数 为 二叉树根节点

在中序遍历中找到这个根节点 然后就可以将当前遍历到的那部分划分成——根 左子树 右子树

然后将每部分进行递归完成

分治法的思想体现在——

把数组逐渐划分为 根 左子树 右子树 这几个部分

另外这题的难点与关键是——

  • 理解这一大堆参数
_buildTree中的这些参数!
//preorder 二叉树前序遍历输入数组 inorder 二叉树中序遍历输入数组

// preLeft 前序遍历左边界 preRight 前序遍历右边界

// inLeft 中序遍历左边界 inRight 中序遍历右边界
  • 通过参数与参数的加减得到正确的边界值

下面看看威威哥画的题解 好理解些~

在这里插入图片描述

Java代码

class Solution {
   
    //01 用下面这些元素构造二叉树 —————— 
    //输入数组preorder [preLeft, preRight]中的所有元素
    //inorder [inLeft, inRight]中的所有元素
    public TreeNode _buildTree(int[] preorder, int preLeft, int preRight, int[] inorder, int inLeft, int inRight
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值