【递归、搜索与回溯】二叉树中的深度优先搜索:布尔二叉树,求根节点到叶节点数字之和,二叉树剪枝,验证二叉搜索树,第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);
    }
}
相关推荐
05Kevin14 小时前
lk每日冒险题--数据结构6.27
算法
To_OC1 天前
从一次栈溢出报错说起,我把递归彻底扒明白了
javascript·算法·程序员
千纸鹤安安1 天前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法
七牛开发者1 天前
MCP 到底是什么?为什么 Agent 都想接上它
算法·aigc·agent
kisshyshy2 天前
从递归到迭代,一文吃透二叉树的核心知识与 JavaScript 实现
javascript·算法·代码规范
To_OC2 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
用户938515635072 天前
从 O(n²) 到 O(nlogn):一文读懂快速排序的“快”与“妙”
javascript·算法