【递归、搜索与回溯】二叉树中的深度优先搜索:布尔二叉树,求根节点到叶节点数字之和,二叉树剪枝,验证二叉搜索树,第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);
    }
}
相关推荐
阿旭超级学得完2 小时前
C++11包装器(function和bind)
java·开发语言·c++·算法·哈希算法·散列表
li星野2 小时前
位运算 & 数学 & 高频进阶九题通关(Python + C++)
c++·python·学习·算法
jerryinwuhan2 小时前
hello算法,简单讲(1)
算法·排序算法
y = xⁿ2 小时前
20天速通LeetCodeday15:BFS广度优先搜索
算法·宽度优先
400分2 小时前
吃透RAG核心-----语义检索与关键字检索底层原理
算法·架构
目黑live +wacyltd2 小时前
算法备案:常见驳回原因与应对策略
人工智能·算法
磊 子3 小时前
多态类原理+四种类型转换+异常处理
开发语言·c++·算法
染指11104 小时前
3.AI大模型-token是什么-大模型底层运行机制
人工智能·算法·机器学习
谙弆悕博士4 小时前
快速学C语言——第19章:C语言常用开发库
c语言·开发语言·算法·业界资讯·常用函数
光影少年4 小时前
前端算法题
前端·javascript·算法