【递归、搜索与回溯】二叉树中的深度优先搜索:布尔二叉树,求根节点到叶节点数字之和,二叉树剪枝,验证二叉搜索树,第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);
    }
}
相关推荐
8Qi83 小时前
LeetCode 75:颜色分类(荷兰国旗问题)—— Java 题解 ✅
java·算法·leetcode·指针·排序
888CC++5 小时前
如何在 C 语言中进行程序调试?
前端·javascript·算法
(●—●)橘子……6 小时前
力扣第503场周赛练习理解
python·学习·算法·leetcode·职场和发展·周赛
明志数科8 小时前
4D时序标注技术详解:让机器人理解连续动作的数据基础
java·算法·机器人
KaMeidebaby8 小时前
卡梅德生物技术快报|原核表达系统工艺优化:包涵体重折叠 + 分子筛纯化实现功能 RBD 高效制备,附全参数配置
前端·人工智能·算法·数据挖掘·数据分析
无限码力8 小时前
携程0510笔试真题【单数组交换】
算法·携程笔试·携程笔试真题·携程0510笔试真题
BlockWay9 小时前
WEEX Labs 周度观察:微软-OpenAI 合作调整与AI 多云趋势
大数据·人工智能·算法·安全·microsoft
风筝在晴天搁浅9 小时前
快手 CodeTop LeetCode 224.基本计算器
数据结构·算法·leetcode
Smoothcloud润云9 小时前
5大功能精修,重构AI算力使用体验!
java·人工智能·windows·算法·重构·编辑器·sublime text