【递归、搜索与回溯】二叉树中的深度优先搜索:布尔二叉树,求根节点到叶节点数字之和,二叉树剪枝,验证二叉搜索树,第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);
    }
}
相关推荐
Bruce_Liuxiaowei3 小时前
驴滑块拼图游戏:从19世纪的纸片谜题到数学博弈论
人工智能·算法
一直C4 小时前
Linux系统编程|信号进阶 + SystemV IPC(消息队列、共享内存)
linux·c语言·开发语言·算法·青少年编程·vim
鹿角片ljp5 小时前
LeetCode 141. 环形链表|从 HashSet 到快慢指针 O (1) 空间最优解
算法·leetcode·链表
薛定e的猫咪5 小时前
(NeurIPS 2022)GraphGPS:MPNN 与全局注意力的融合之道
人工智能·深度学习·学习·算法
AI服务老曹6 小时前
车牌识别算法接入AI视频分析平台的流程和误报优化
人工智能·算法·音视频
神威难绷泪6 小时前
Linux应用软件编程:线程分离属性 互斥机制 同步机制 死锁
linux·开发语言·算法·线程
小星星闪亮登场6 小时前
图论--最小生成树(内含二分图)
数据结构·算法·图论·迭代加深·图搜索算法
ZC跨境爬虫6 小时前
LeetCode 219. 存在重复元素 II(滑动窗口 + 哈希表详解)
算法·leetcode·散列表
吞下星星的少年·-·7 小时前
The 2025 ICPC Asia East Continent Online Contest (I) A题(模拟+贪心)
算法·贪心·模拟
小程序设计7 小时前
【机械设计】磁粉检测机器人的设计与验证
算法·机器人