【递归、搜索与回溯】二叉树中的深度优先搜索:布尔二叉树,求根节点到叶节点数字之和,二叉树剪枝,验证二叉搜索树,第K小的元素,二叉树的所有路径

文章目录

1. 计算布尔二叉树的值(LC2331)

计算布尔二叉树的值

题目描述

解题思路

递归调用得到左右子树的布尔值,再根据根节点的操作符计算。

代码实现

java 复制代码
public boolean evaluateTree(TreeNode root) {
        if(root.left==null  && root.right==null)
            return root.val == 1;
        
        boolean left = evaluateTree(root.left);
        boolean right = evaluateTree(root.right);
        if(root.val == 2)
            return left || right;
        if(root.val == 3)
            return left && right;
        return true;
    }

2. 求根节点到叶节点数字之和(LC129)

求根节点到叶节点数字之和

题目描述

解题思路

对于每一个被遍历的节点:

  1. 接收前面的路径和
  2. 调用dfs得到左子树的路径和
  3. 调用dfs得到左子树的路径和
  4. 把左右子树的路径和加和返回

函数头:

  • 参数:rootpresum
  • 返回值:该节点左右子树的路径和

代码实现

java 复制代码
public int sumNumbers(TreeNode root) {
        return dfs(root,0);
    }
    int dfs(TreeNode root,int preSum){
        if(root==null)
            return 0;
        preSum = preSum*10 + root.val;
        //叶子节点
        if(root.left==null && root.right==null)
            return preSum;
        return dfs(root.left,preSum) + dfs(root.right,preSum);
    }

3. 二叉树剪枝(LC814)

二叉树剪枝

题目描述

解题思路

递归调用函数,如果子树全为0,就自身的两个孩子指向改为null,返回null。如果左右接收值都是null,继续返回null

代码实现

java 复制代码
public TreeNode pruneTree(TreeNode root) {
        if(root==null)
            return null;
        if(pruneTree(root.left)==null)
            root.left = null;
        if(pruneTree(root.right)==null)
            root.right = null;
        if(root.left==null && root.right == null && root.val ==0)
            root = null;
        return root;
    }

4. 验证二叉搜索树(LC98)

验证二叉搜索树

题目描述

解题思路

二叉搜索树的中序遍历是有序序列。定义全局变量prev记录前一个节点的值,遍历到下一个节点只需要与前一个做比较。当有一个不符合直接返回false,整体就不是二叉搜索树。

代码实现

java 复制代码
class Solution {
    long prev = Long.MIN_VALUE;
    public boolean isValidBST(TreeNode root) {
        if(root==null)
            return true;
        //剪枝
        if(!isValidBST(root.left))
            return false;;

        if(root.val<=prev)
            return false;
        else 
            prev = root.val;

        //剪枝
        if(!isValidBST(root.right))
            return false;
        return true;
    }
}

5. 二叉搜索树中第K小的元素(LC230)

二叉搜索树中第K小的元素

题目描述

解题思路

利用二叉搜索树中序遍历,定义全局变量cntret,每遍历一个节点,cnt--,当cnt为0时,ret置为对应的节点,直接返回,后续都不需要再遍历(剪枝)

代码实现

java 复制代码
class Solution {
    int cnt;
    int ret;
    public int kthSmallest(TreeNode root, int k) {
        cnt = k;
        dfs(root);
        return ret;
    }
    void dfs(TreeNode root){
        if(root==null || cnt<=0)
            return;
        dfs(root.left);
        if(cnt==1){
            ret=root.val;
            cnt--;
            return;
        }else
            cnt--;
        dfs(root.right);

    }
}

6. 二叉树的所有路径(LC257)

二叉树的所有路径

题目描述

解题思路

定义全局变量String[] ret存放结果。

  • 函数头:void dfs(TreeNode root,String path)

注意:path也可以设置为全局变量,但是函数返回的时候要"回复现场",操作比较麻烦,把它作为函数参数,返回时形参不会影响实参的值。

代码实现

java 复制代码
class Solution {
    List<String> ret = new ArrayList();
    public List<String> binaryTreePaths(TreeNode root) {
        String path = "";
        dfs(root,path);
        return ret;
    }
    void dfs(TreeNode root,String path){
        if(root==null)
            return;
        String newPath;
        if(path.equals(""))
            newPath = root.val+"";
        else
            newPath = path+"->"+root.val;
        
        dfs(root.left,newPath);
        dfs(root.right,newPath);
        if(root.left==null && root.right==null)
            ret.add(newPath);
    }
}
相关推荐
wabs66615 小时前
关于图论【卡码网117.软件构建的思考】
数据结构·算法·软件构建·图论·卡码网
mifengxing16 小时前
LeetCode 41.缺失的第一个正数|Hard题O(n)+O(1)最优解法深度解析
java·算法·leetcode·排序算法
Tongzhi202616 小时前
从部署到运维:通芝科技无感考勤一体机的全流程效率解析
运维·数据结构·科技·算法·贪心算法
Wang's Blog16 小时前
AI Agent白手起家30: 动态示例选择器之根据长度选择 Few Shot 示例
算法
oyguyteggytrrwwwrt18 小时前
自制交叉线路识别算法
算法
手写码匠18 小时前
华为云Flexus+DeepSeek征文|Dify 多智能体协同编排实战:R1 规划 + V3 执行,构建企业 Agent 团队
人工智能·深度学习·算法·aigc
晓天衡宇•评测社区19 小时前
FSR-Bench 前沿科学推理榜单发布:GPT-5.5 居首,“会推理”未必“能答对”
算法
程序喵大人20 小时前
【C++进阶】STL算法与函数对象 - 02 sort为什么需要随机访问迭代器
开发语言·c++·算法
hanlin0320 小时前
动态规划专练:力扣第121、122题
笔记·算法·leetcode
To_OC21 小时前
LC 74 搜索二维矩阵:换皮的二分查找,我居然一开始没看出来
javascript·算法·leetcode