当前位置: 首页 > news >正文

二叉树的深搜

前言: 本章节更深入学习递归

计算布尔二叉树的值

 

思路: 
1.函数头设计:dfs(root)

2.函数体:需要一个接收left 和 right 的值  并且根据root的值进行比较

3.递归出口:很明显 当为叶子节点的时候 向上返回你叶子节点的值 并且与当前root的值进行比较

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

求根节点到叶节点数字之和

 

从根节点开始,遍历每个节点,如果遇到叶子节点,则将叶子节点对应的数字加到数字之和。如果当前节点不是叶子节点,则计算其子节点对应的数字,然后对子节点递归遍历。

    int ret = 0;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 ret += preSum;}if (root.left != null) {dfs(root.left, preSum);}if (root.right != null) {dfs(root.right, preSum);}return ret;}

 二叉树剪枝

 

思路: 叶子节点为0 直接让它指向空  后序遍历思想

1.遍历完左子树 再遍历右子树

2. 如果遇到叶子节点 则判断当前节点是否为0 

3.如果为0 则直接返回null  否则不需要剪枝 直接返回原来值

    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) {return null;} else {return root;}}

验证二叉搜索树

思路:二叉搜索树 中序遍历是一个有序数组 利用这一特性
先定义一个最小数字prev

当遍历完左子树回退时候

比较是否prev跟当前回退的数字大小 

如果比prev大 则让prev=当前节点的值 

否则 就不是二叉搜索树

    long prev = Long.MIN_VALUE;public boolean isValidBST(TreeNode root) {if (root == null) {return true;}if (!isValidBST(root.left) || root.val <= prev) {return false;}prev = root.val;return isValidBST(root.right);}

 二叉搜索树中第 K 小的元素

 思路: 要求二叉搜索树第k大的数字

定义俩个全局变量 ret记录最终结果 count记录当前k

依次遍历到左子树 当为空的时候 就该回退了

并且 count-1 当count为0的时候 就是目标值了

 int ret;int count ;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);}

 

http://www.lryc.cn/news/477223.html

相关文章:

  • JUC笔记之ReentrantLock
  • 【含文档】基于ssm+jsp的图书管理系统(含源码+数据库+lw)
  • pytorch知识蒸馏测试
  • mutable用法
  • SQL语言基础
  • 在USB电源测试中如何降低测试成本?-纳米软件
  • springboot - 定时任务
  • 一篇文章理解CSS垂直布局方法
  • SpringBoot day 1105
  • MySQL 完整教程:从入门到精通
  • 【贝叶斯公式】贝叶斯公式、贝叶斯定理、贝叶斯因子,似然比
  • [libos源码学习 1] Liboc协程生产者消费者举例
  • Python OpenCV 图像改变
  • k8s按需创建 PV和创建与使用 PVC
  • 揭秘云计算 | 2、业务需求推动IT发展
  • 【系统面试篇】进程与线程类(2)(笔记)——进程调度、中断、异常、用户态、核心态
  • 基于MySQL的企业专利数据高效查询与统计实现
  • 热成像手机VS传统热成像仪:AORO A23为何更胜一筹?
  • Spring IoC——依赖注入
  • Linux 中,flock 对文件加锁
  • CentOS下载ISO镜像的方法
  • Node.js 入门指南:从零开始构建全栈应用
  • MYSQL 真实高并发下的死锁
  • Zookeeper 简介 | 特点 | 数据存储
  • 设计模式之结构型模式---装饰器模式
  • Android Pair
  • 华为荣耀曲面屏手机下面空白部分设置颜色的方法
  • 《C#语法一篇通》,有20万字,需8MB字节,宜48小时阅读,没准会继续完善
  • 嵌入式硬件工程师的职业发展规划
  • QT for android 问题总结(QT 5.15.2)