【leetcode】DFS高频题目整理

186 阅读2分钟

DFS

树形

  • 【offer 07】重建二叉树:前序+中序复原二叉树

  • 【98】验证二叉搜索树

    • func isValidBST(root *TreeNode) bool {
          return judge(root,math.MinInt,math.MaxInt)
      }
      
      func judge(root *TreeNode,minn,maxx int) bool{
          if root == nil{
              return true
          }
          if root.Val<=minn || root.Val>=maxx{
              return false
          }
          return judge(root.Left, minn,root.Val) && judge(root.Right, root.Val, maxx)
      }
      
  • 二叉树的最近公共祖先:返回值记录查找到的个数+答案

    • 看左右儿子,分别有几个待查找节点

      • 左或右有两个:直接 返回2,儿子

      • 左+右=2:返回2,自己

      • 看自己是不是

        • 是:返回1+左+右,自己
        • 否:返回左+右,自己
  • 【109】有序链表转换二叉搜索树

  • 【124】二叉树中的最大路径和、【543】二叉树的直径

    • dfs查找以当前节点为中转的路径最大的长度
    • ans = max(ans,root.Val+max(maxl,0)+max(0,maxr))
  • 【offer 26】树的子结构

  • 【122】路径总和

  • 【101】对称二叉树

  • 【104】二叉树的最大深度

  • 【113】路径总和 II:dfs记录根节点到当前节点的值的和

  • 【129】求根节点到叶节点数字之和

  • 【297】二叉树的序列化与反序列化:dfs遍历,空值填*占位

  • 【386】字典序排数:想象在一个Trie树上dfs搜索

  • 【426】将二叉搜索树转化为排序的双向链表、【offer 36】二叉搜索树与双向链表

  • 【offer 33】二叉搜索树的后序遍历序列

  • 【offer 34】二叉树中和为某一值的路径

  • 【offer 32】从上到下打印二叉树 III

一维

  • 【22】括号生成:递归限制:左括号数不大于全长的一半,右括号数<=左括号数

  • 全排列:标准dfs

  • 【78】子集

  • 【93】复原 IP 地址:一个字符串,输出所有可能的IP地址

    • dfs:记录tmp长度、分隔次数,停止条件:用了所有字母、切分了四次。注意每次加入1、2、3位数符合0~255
  • 【131】分割回文串:dfs枚举是否可以分割

  • 【39】组合总和:从小到大枚举保持顺序进行去重

  • 【40】组合总和 II,枚举每一个数选、不选,注意去重

  • 【47】全排列 II:注意去重,相同的数前面的有没用的就不能用后面的:

    • i>0 && nums[i]==nums[i-1] && m[i-1]==false 就跳过
  • 【77】组合:枚举每一个数选、不选,注意去重(从小到大枚举)

  • 【394】字符串解码:遇到左括号,找到字串,递归得到结果,再重复tmp次

  • 【offer 38】字符串的排列:标准dfs求全排列

二维空间

  • 【695】岛屿的最大面积
  • 【329】矩阵中的最长递增路径:dfs+状态记忆
  • 【51】N 皇后
  • 【offer 12】矩阵中的路径