前端学习记录
  • 前言及目录
  • 前端基础
    • HTML
    • CSS
      • CSS学习之布局
    • JavaScript
      • 跟着月影学JavaScript
      • JavaScript之对象、原型链及继承
      • JavaScript中的类
      • onclick与addEventListener区别
      • JS手撕题
    • HTTP与浏览器
      • HTTP实用指南
      • Web开发的安全之旅
    • 通用知识
      • 前端必须知道的开发调试知识
      • 前端设计模式应用
      • Web 标准与前端开发
  • 数据结构及算法
    • 数据结构
      • 1、线性表(List)
      • 2、堆栈(Stack)
      • 3、队列(Queue)
      • 4、二叉树(Binary Tree)
      • 5、二叉搜索树与平衡二叉树(BST & AVL)
      • 6、堆(Stack)& 哈夫曼树 & 并查集
      • 7、图(Graph)
        • 图论——解决最小生成树问题(Kruskal算法&Prim算法)
      • 8、排序(sort)
      • 9、散列表(hash)
      • 数据结构习题
        • 第一周:最大子列和算法、二分查找
        • 第二周:线性结构
        • 第三周:栽树(二叉树等)
        • 第四周:二叉搜索树&二叉平衡树
        • 第五周:堆&哈夫曼树&并查集
        • 第六周:图(上)连通集 、DFS&BFS
        • 第七周:图(中)Floyd算法求最短路
        • 第八周:图(下)
        • 第九周:排序(上)归并&堆排序
        • 第十周:排序(下)
        • 第十一周:散列查找 & KMP
    • CS基础
      • 编译原理 实验一 词法分析器设计
      • 编译原理 实验二 LL(1)分析法程序
    • LeetCode
      • 冲刺春招-精选笔面试 66 题大通关
        • day1:21. 合并两个有序链表、146. LRU 缓存、25. K 个一组翻转链表
        • day2:14. 最长公共前缀、3. 无重复字符的最长子串、124. 二叉树中的最大路径和
        • day3:206. 反转链表、199. 二叉树的右视图、bytedance-016最短移动距离
        • day4:1. 两数之和、15. 三数之和、42. 接雨水
        • day5:7. 整数反转、215. 数组中的第K个最大元素、23. 合并K个升序链表
        • day6:33. 搜索旋转排序数组、54. 螺旋矩阵、bytedance-006. 夏季特惠
        • day7:53. 最大子数组和、152. 乘积最大子数组、41. 缺失的第一个正数
        • day8:20. 有效的括号、200. 岛屿数量、76. 最小覆盖子串
        • day9:105. 从前序与中序遍历序列构造二叉树、103. 二叉树的锯齿形层序遍历、bytedance-010. 数组组成最大数
        • day10:94. 二叉树的中序遍历、102. 二叉树的层序遍历、394. 字符串解码
        • day11:415. 字符串相加、5. 最长回文子串、72. 编辑距离
        • day12:64. 最小路径和、300. 最长递增子序列、bytedance-004. 机器人跳跃问题
        • day13:88. 合并两个有序数组、31. 下一个排列、4. 寻找两个正序数组的中位数
        • day14:121. 买卖股票的最佳时机、56. 合并区间、135. 分发糖果
        • day15:232. 用栈实现队列、22. 括号生成、128. 最长连续序列
        • day16:bytedance-007. 化学公式解析、129. 求根节点到叶节点数字之和、239. 滑动窗口最大值
        • day17:141. 环形链表、236. 二叉树的最近公共祖先、92. 反转链表 II
        • day18:322. 零钱兑换、198. 打家劫舍、 bytedance-003. 古生物血缘远近判定
        • day19:160. 相交链表、143. 重排链表、142. 环形链表 II
        • day20:704. 二分查找、43. 字符串相乘、bytedance-002. 发下午茶
        • day21题目:69. x 的平方根、912. 排序数组、887. 鸡蛋掉落
        • day22:151. 颠倒字符串中的单词、46. 全排列、2. 两数相加
      • 剑指 Offer
        • 剑指offer day1 栈与队列(简单)
        • 剑指offer day2 链表(简单)
        • 剑指offer day3 字符串(简单)
        • 剑指offer day4 查找算法(简单)
        • 剑指offer day5 查找算法(中等)
        • 剑指offer day6 搜索与回溯算法(简单)
        • 剑指offer day7 搜索与回溯算法(简单)
        • 剑指offer day8 动态规划(简单)
        • 剑指offer day9 动态规划(中等)
        • 剑指offer day10 动态规划(中等)
        • 剑指offer day11 双指针(简单)
        • 剑指offer day12 双指针(简单)
        • 剑指offer day13 双指针(简单)
        • 剑指offer day14 搜索与回溯算法(中等)
        • 剑指offer day15 搜索与回溯算法(中等)
        • 剑指offer day16 排序(简单)
        • 剑指offer day17 排序(中等)
      • 剑指 Offer 专项突击版
  • 前端进阶
    • React
      • 响应式系统与 React
      • React学习小记
      • Redux学习之Redux三原则、createSore原理及实现
    • Vue
    • TypeScript
      • TypeScript入门
      • TypeScript 类型体操练习
        • Easy题(13/13)
        • Middle(20/72)
    • 前端工程化
      • Webpack知识体系
    • Node
    • 前端动画与绘图
      • WebGL基础
      • 前端动画简介
      • Floating UI 使用经验分享 - Popover
      • Floating UI 使用经验分享 - Dialog
      • Three.js 学习
        • 学习记录
        • 资源记录
    • 前端性能优化
    • 跨端
      • RN 学习小记之使用 Expo 创建项目
    • 开源
    • SEO 优化
      • 搜索引擎优化 (SEO) 新手指南笔记
  • 笔面试记录
    • 面经集锦
      • 2022春暑期实习MetaApp一二面面经
      • 2022春暑期实习字节前端一面凉经
    • 笔试复盘
      • 2022春暑期实习-美团前端-笔试
      • 2022春暑期实习-360前端-笔试(AK)
      • 2022春暑期实习-京东前端-笔试
      • 2022春暑期实习-网易雷火前端-笔试(AK)
      • 2022春暑期实习-网易互联网前端-暑期实习笔试
由 GitBook 提供支持
在本页
  • 剑指 Offer 34. 二叉树中和为某一值的路径
  • 思路
  • 剑指 Offer 36. 二叉搜索树与双向链表
  • 思路
  • 剑指 Offer 54. 二叉搜索树的第k大节点
  • 思路

这有帮助吗?

在GitHub上编辑
导出为 PDF
  1. 数据结构及算法
  2. LeetCode
  3. 剑指 Offer

剑指offer day15 搜索与回溯算法(中等)

上一页剑指offer day14 搜索与回溯算法(中等)下一页剑指offer day16 排序(简单)

最后更新于3年前

这有帮助吗?

day15题目:、、

知识点:树、深搜、栈,难度为中等、中等、简单

学习计划链接:

题目
知识点
难度

中等

中等

简单

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。

示例 1:

输入: root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出: [[5,4,11,2],[5,8,4,5]]

示例 2:

输入: root = [1,2,3], targetSum = 5
输出: []

示例 3:

输入: root = [1,2], targetSum = 0
输出: []

提示:

  • 树中节点总数在范围 [0, 5000] 内

  • -1000 <= Node.val <= 1000

  • -1000 <= targetSum <= 1000

思路

d!都可以d!

通过dfs,每次传递当前结点和路径和

/**
 * @param {TreeNode} root
 * @param {number} target
 * @return {number[][]}
 */
var pathSum = function(root, target) {
    if(!root) return []
    let res = []
    let path = []
    function dfs(rt, sum) {
        if(!rt) return 
        if(!rt.left && !rt.right) { // 为叶子节点了
            if(rt.val+sum === target) 
                res.push(path.concat(rt.val))
            return 
        } else if(rt.left && rt.right) { // 为非叶子节点
            path.push(rt.val)
            dfs(rt.left, sum+rt.val)
            dfs(rt.right, sum+rt.val)
            path.pop()
        } else if(rt.left) { // 为左子树
            path.push(rt.val)
            dfs(rt.left, sum+rt.val)
            path.pop()
        } else { // 为右子树
            path.push(rt.val)
            dfs(rt.right, sum+rt.val)
            path.pop()
        }
    }
    dfs(root, 0)
    return res
};

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。

为了让您更好地理解问题,以下面的二叉搜索树为例:

我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。

下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。

特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。

注意: 此题对比原题有改动。

思路

题目要求节点应从小到大排序,而二叉搜索树的中序遍历是递增的,故中序遍历的同时构建相邻节点的引用关系,注意的是prev和head一开始都为null,直到找到第一个节点时head才被置为第一个结点,然后将prev置为当前节点。所以dfs完后还需进行尾部与头节点的一个连接

/**
 * @param {Node} root
 * @return {Node}
 */
var treeToDoublyList = function(root) { // 左前右后
    if(!root) return null
    let [head, prev] = [null, null]
    function dfs(rt) {
        if(!rt) return
        dfs(rt.left)
        if(prev) prev.right = rt    // 前结点的右结点指向当前结点
        else head = rt
        rt.left = prev              // 当前结点的前指针指向前结点
        prev = rt
        dfs(rt.right)
    }
    dfs(root)
    head.left = prev
    prev.right = head
    return head
};

给定一棵二叉搜索树,请找出其中第 k 大的节点的值。

示例 1:

输入: root = [3,1,4,null,2], k = 1
   3
  / \
 1   4
  \
   2
输出: 4

示例 2:

输入: root = [5,3,6,2,4,null,null,1], k = 3
       5
      / \
     3   6
    / \
   2   4
  /
 1
输出: 4

限制:

  • 1 ≤ k ≤ 二叉搜索树元素个数

思路

上题也说了,二叉搜索树中序遍历是递增的,而先访问右侧结点的话,右中左则是递减的,因此取k个就好了。

/**
 * @param {TreeNode} root
 * @param {number} k
 * @return {number}
 */
var kthLargest = function(root, k) {
    let [cnt, res] = [0, 0];
    function dfs(rt) {
        if(!rt) return
        dfs(rt.right)
        if(++cnt === k) {
            res = rt.val
            return
        }
        dfs(rt.left)
    }
    dfs(root)
    return res
};

、、、

、、

、、

注意:本题与主站 113 题相同:

注意: 本题与主站 426 题相同:

https://leetcode-cn.com/problems/path-sum-ii/
剑指 Offer 36. 二叉搜索树与双向链表
https://leetcode-cn.com/problems/convert-binary-search-tree-to-sorted-doubly-linked-list/
剑指 Offer 54. 二叉搜索树的第k大节点
剑指 Offer 34. 二叉树中和为某一值的路径
树
深度优先搜索
回溯
二叉树
剑指 Offer 36. 二叉搜索树与双向链表
栈
树
深度优先搜索
剑指 Offer 54. 二叉搜索树的第k大节点
树
深度优先搜索
二叉搜索树
剑指 Offer 34. 二叉树中和为某一值的路径
剑指 Offer 36. 二叉搜索树与双向链表
剑指 Offer 54. 二叉搜索树的第k大节点
「剑指 Offer」 - 学习计划
剑指 Offer 34. 二叉树中和为某一值的路径