二叉树中的深搜

ops/2024/10/18 7:57:34/

  • 🎥 个人主页:Dikz12
  • 🔥个人专栏:算法(Java)
  • 📕格言:吾愚多不敏,而愿加学
  • 欢迎大家👍点赞✍评论⭐收藏

目录

1. 计算布尔二叉树的值 

 1.1 题目描述

1.2 题解

1.3 代码实现 

 2. 求根节点到叶子节点数字之和

 2.1 题目描述

2.2 题解 

 2.3 代码实现

3. 二叉树剪枝

3.1 题目描述

3.2 题解 

3.3 代码实现 

4. 验证二叉搜索树 

4.1 题目描述 

 4.2 题解

4.3 代码实现 

 5.二叉搜索树中第k个小的元素

 5.1 题目描述

5.2 题解 

5.3 代码实现 

 6. 二叉树的所有路径

6.1 题目描述 

6.2 题解 

6.3 代码实现 


1. 计算布尔二叉树的值 

 1.1 题目描述

1.2 题解

递归函数设计:boolean evaluateTree(TreeNode root)
  1. 返回值:当前节点值;
  2. 参数:当前节点指针。
  3. 函数作⽤:求得当前节点通过逻辑运算符得出的值。
递归函数流程:
  1. 当前问题规模为 n=1 时,即叶⼦节点,直接返回当前节点值;
  2. 递归求得左右⼦节点的值;
  3. 通过判断当前节点的逻辑运算符,计算左右⼦节点值运算得出的结果;

1.3 代码实现 

    public boolean evaluateTree(TreeNode root) {//出口if(root.left == null) {return root.val == 0 ? false : true;}boolean left = evaluateTree(root.left);boolean right = evaluateTree(root.right);return root.val == 2 ? left | right : left & right;}

 2. 求根节点到叶子节点数字之和

 2.1 题目描述

2.2 题解 

算法思路:
在前序遍历的过程中,我们可以往左右⼦树传递信息,并且在回溯时得到左右⼦树的返回值。递归函 数可以帮我们完成两件事:
  1. 将⽗节点的数字与当前节点的信息整合到⼀起,计算出当前节点的数字,然后传递到下⼀层进⾏递 归;
  2.  当遇到叶⼦节点的时候,就不再向下传递信息,⽽是将整合的结果向上⼀直回溯到根节点。 在递归结束时,根节点需要返回的值也就被更新为了整棵树的数字和。

 2.3 代码实现

    public int sumNumbers(TreeNode root) {return dfs(root,0);}public int dfs(TreeNode root,int preSum) {preSum = preSum * 10 + root.val;//递归出口if(root.left == null && root.right == null) {return preSum;}int num = 0;if(root.left != null) {num += dfs(root.left,preSum);}if(root.right != null) {num += dfs(root.right,preSum);}return num;}

3. 二叉树剪枝

3.1 题目描述

3.2 题解 

算法流程:
递归函数设计:void dfs(TreeNode root)
  1. 返回值:⽆;
  2. 参数 :当前需要处理的节点;
  3. 函数作⽤:判断当前节点是否需要删除,若需要删除,则删除当前节点。
后序遍历的主要流程:
  1. 递归出⼝:当传⼊节点为空时,不做任何处理;
  2. 递归处理左⼦树;
  3. 递归处理右⼦树;
  4. 处理当前节点:判断该节点是否为叶⼦节点(即左右⼦节点均被删除,当前节点成为叶⼦节点), 并且节点的值为 0: a. 如果是,就删除掉; b. 如果不是,就不做任何处理。

3.3 代码实现 

    public TreeNode pruneTree(TreeNode root) {if(root == null) {return null;}root.left = pruneTree(root.left);root.right = pruneTree(root.right);if(root.left == null && root.right == null && root.val == 0) {root = null;}return root;}

4. 验证二叉搜索树 

4.1 题目描述 

 4.2 题解

算法思路:
如果⼀棵树是⼆叉搜索树,那么它的中序遍历的结果⼀定是⼀个严格递增的序列。
因此,我们可以初始化⼀个⽆穷⼩的全区变量,⽤来记录中序遍历过程中的前驱结点。那么就可以在 中序遍历的过程中,先判断是否和前驱结点构成递增序列,然后修改前驱结点为当前结点,传⼊下⼀ 层的递归中。

4.3 代码实现 

    long prev = Long.MIN_VALUE;public boolean isValidBST(TreeNode root) {if(root == null) {return true;}boolean left = isValidBST(root.left);//剪枝if(left == false) {return false;}//当前节点boolean ret = false;if(prev < root.val) {prev = root.val;ret = true;    }boolean right = isValidBST(root.right);return left && ret && right;}

 5.二叉搜索树中第k个小的元素

 5.1 题目描述

5.2 题解 

算法思路:
上述解法不仅使⽤⼤量额外空间存储数据,并且会将所有的结点都遍历⼀遍。
但是,我们可以根据中序遍历的过程,只需扫描前 k 个结点即可。
因此,我们可以创建⼀个全局的计数器 count,将其初始化为 k,每遍历⼀个节点就将 count--。直到 某次递归的时候,count 的值等于 0,说明此时的结点就是我们要找的结果。

5.3 代码实现 

    int count;int ret;public int kthSmallest(TreeNode root, int k) {count = k;dfs(root);return ret;}public void dfs(TreeNode root) {if(root == null) {return;}dfs(root.left);count--;if(count == 0) {ret = root.val;return;}dfs(root.right);}

 6. 二叉树的所有路径

6.1 题目描述 

6.2 题解 

算法思路:
使⽤深度优先遍历(DFS)求解。
路径以字符串形式存储,从根节点开始遍历,每次遍历时将当前节点的值加⼊到路径中,如果该节点 为叶⼦节点,将路径存储到结果中。否则,将 "->" 加⼊到路径中并递归遍历该节点的左右⼦树。 定义⼀个结果数组,进⾏递归。递归具体实现⽅法如下:
  1. 如果当前节点不为空,就将当前节点的值加⼊路径 path 中,否则直接返回;
  2. 判断当前节点是否为叶⼦节点,如果是,则将当前路径加⼊到所有路径的存储数组 ret 中;
  3. 否则,将当前节点值加上 "->" 作为路径的分隔符,继续递归遍历当前节点的左右⼦节点。
  4. 返回结果数组。

6.3 代码实现 

    List<String> ret;public List<String> binaryTreePaths(TreeNode root) {ret = new ArrayList<>();dfs(root, new StringBuffer());return ret;}public void dfs(TreeNode root, StringBuffer _path) {StringBuffer path = new StringBuffer(_path);path.append(Integer.toString(root.val));if (root.left == null && root.right == null) {ret.add(path.toString());return;}path.append("->");if (root.left != null) {dfs(root.left, path);}if (root.right != null)dfs(root.right, path);}

 


http://www.ppmy.cn/ops/93145.html

相关文章

算法与数据结构面试宝典:详解算法效率评估方法及示例(C/C++)

文章目录 一、算法效率评估概述二、时间复杂度评估三、空间复杂度评估四、实际性能五、总结 在面试过程中&#xff0c;算法效率评估是衡量候选人能力的重要环节。本文将详细介绍如何进行算法效率评估&#xff0c;并通过C/C语言示例&#xff0c;帮助大家更好地备战面试。 一、算…

LVS是什么?以及LVS-NAT以及DR模式实验

目录 NAT LVS LVS集群的类型&#xff1a; LVS-NAT模式实验 环境准备&#xff1a; 实验步骤&#xff1a; LVS-DR模式实验 题目&#xff1a; 环境准备&#xff1a; 实验步骤&#xff1a; LVS-防火墙标签解决轮询调度问题 环境准备&#xff1a; 实验步骤&#xff1…

嵌入式人工智能(OpenCV-图像的基本操作)

1、OpenCV简介 人工智能一个重要方面的应用就是计算机视觉&#xff0c;而OpenCV正是基于BSD许可发行的开源、跨平台的计算机视觉库。它可以运行在Linux、Windows、Android和Mac OS操作系统上。 [1]它轻量级而且高效——由一系列 C 函数和C 类构成&#xff0c;同时提供了Python…

Python和AI库NumPy(三):数组形状与变换

目录 1. 数组的基础形状操作 1.1 查看数组的形状 1.2 改变数组的形状 2. 数组的转置与轴交换 2.1 数组的转置 2.2 交换数组的轴 3. 数组的合并与分割 3.1 数组的水平与垂直合并 3.2 数组的分割 4. 高级数组变换技巧 4.1 广播机制(Broadcasting) 4.2 使用expand_d…

24款奔驰C260升级原厂香氛负离子系统,淡淡的幽香

奔驰原厂香氛系统激活原车自带系统&#xff0c;将香气加藏储物盒中&#xff0c;通过系统调节与出风口相结合&#xff0c;再将香味传达至整个车厢&#xff0c;达到净化车厢空气的效果&#xff0c;让整个车厢更加绿色健康&#xff0c;清新淡雅。 产品功能&#xff1a;香氛负离子…

滑动窗口 | Java | (hot100) 力扣 3

力扣 3.无重复字符的最长子串 暴力法&#xff1a;双层for循环&#xff0c;i-j的字符查重 滑动窗口&#xff1a;因为这题被分在这个类别里&#xff0c;那么已知要用滑动窗口&#xff0c;思路应该是什么。 反正我想不出来…… 看了别人的题解写出来的出错点&#xff1a;特别容易…

奥威VS帆软(各有所长)

随着大数据时代的到来&#xff0c;商业智能BI软件成为了企业不可或缺的一部分。它们通过收集、整合、分析和展示数据&#xff0c;帮助企业更好地理解业务状况&#xff0c;做出更明智的决策。奥威BI和帆软BI都是备受瞩目的老牌BI软件&#xff0c;本文将详细对比这两大老牌BI软件…

【人工智能】【机器学习】-好书推荐之《Python神经网络编程》

目录 内容概览 编程环境 面向对象 学习目标 如果你是想要自学机器学习相关知识的读者&#xff0c;我相信看完这篇文章的介绍后&#xff0c;你会对机器学习有更清晰的认识。帮助你走进机器学习的殿堂。 《Python神经网络编程》&#xff08;原书名&#xff1a;Make Your Own …