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

pluto wordpress官网优化公司

pluto wordpress,官网优化公司,app官网入口,品牌策划 网站源码二叉搜索树的最小绝对差 题目详细:LeetCode.530 这道题使我第一次了解到二叉树的双指针遍历法,详细可以先查看卡哥的讲解视频:《代码随想录 — 二叉搜索树中的众数》 利用二叉搜索树的特点: 中序遍历二叉搜索树得到一个有序序…

二叉搜索树的最小绝对差

题目详细:LeetCode.530

这道题使我第一次了解到二叉树的双指针遍历法,详细可以先查看卡哥的讲解视频:《代码随想录 — 二叉搜索树中的众数》

利用二叉搜索树的特点:

  • 中序遍历二叉搜索树得到一个有序序列
  • 计算序列中相邻的每一个数的差值,记录最小绝对值差

但我们可以发现,如果我们可以在遍历过程中去计算相邻的两个数的差值,那么速度将提升很多,对于序列是否有序这一点似乎并不是特别重要,只是二叉搜索树赋予了它这一特点。

那么我们可以利用双指针法:

  • 定义一个指针 pre 指向当前节点的前一个节点
  • 按照左中右的顺序,深度优先遍历树的节点
    • 若 pre 为空,则说明当前节点为叶子节点,不存在前一个节点
    • 若 pre 不为空,则计算前一个节点与当前节点的绝对差值,利用全局变量记录一个最小值结果
  • 注意更新前一个节点 pre = cur

Java解法(递归):

class Solution {public int ans = Integer.MAX_VALUE;public TreeNode pre = null;public int getMinimumDifference(TreeNode root) {this.dfs(root);return ans;}public void dfs(TreeNode cur){if(null == cur) return;this.dfs(cur.left);if(null != this.pre){ans = Math.min(ans, Math.abs(pre.val - cur.val));}this.pre = cur;this.dfs(cur.right);}
}

二叉搜索树中的众数

题目详细:LeetCode.501

传统的暴力解法有:

  • 解法一:得到中序遍历序列后统计序列中出现次数最多的数字
  • 解法二:遍历一次二叉树记录最高出现频率,再中序遍历一次二叉树将出现频率等于最高出现频率的数字加入结果集
  • 这种方法都相当于需要遍历两次二叉树,效率较低,这里就不多赘述了

那么我们能否利用二叉搜索树中序遍历有序的特点,在遍历过程中就统计最高出现频率的数字呢?

在经过上一题了解二叉搜索树中双指针法的应用后,在遇到二叉搜索树相关问题时就又多了一种解题思路(中序遍历+双指针法):

  • 定义两个变量,times 记录当前数字的出现频率,max_times 记录最高出现频率
  • 众所周知,利用二叉搜索树的特点通过中序遍历可以得到一个有序序列
  • 因为中序遍历结果是有序序列,所以数字一定是递增地连续地出现的,那么利用双指针法:
    • 在递归中序遍历二叉树的过程中,通过比较 pre 和 cur 的数值,记录当前数字的出现频率
    • 比较当前出现频率和最高出现频率
      • 若当前出现频率等于最高出现频率,那么将数字加入结果集
      • 若当前出现频率高于已知的最高出现频率,那么更新最高出现频率,并清空当前结果集后,再加入当前数字

Java解法(中序遍历+双指针法):

class Solution {public List<Integer> ans = new ArrayList<>();public int max_times = 1, times = 1;public TreeNode pre = null;public int[] findMode(TreeNode root) {this.dfs(root);return ans.stream().mapToInt(Integer::valueOf).toArray();}public void dfs(TreeNode cur){if(null == cur) return ;// 左this.dfs(cur.left);// 中// 记录当前数字的出现频率if(null != this.pre){if(cur.val == this.pre.val){this.times++;}else{this.times = 1;}}if(this.times == this.max_times){// 如果出现频率等于最高频率,那么将数字加入结果集this.ans.add(cur.val);}else if(this.times > this.max_times){// 如果出现频率高于已知的最高频率,那么更新最高频率,并清空当前结果集后再加入新的数字this.max_times = this.times;this.ans.clear();this.ans.add(cur.val);}this.pre = cur;//右this.dfs(cur.right);}
}

二叉树的最近公共祖先

题目详细:LeetCode.236

由题可知:

  • 所有节点的值都是唯一的
  • p、q 均存在于给定的二叉树中
  • 一个节点也可以是它自己的祖先

所以我们可以先分析当前节点为最近公共祖先的情况有哪些(也就是如何判断该节点是否是p、q的最近公共祖先):

  • 情况一: p 和 q 分别在左子树和右子树,那么当前节点即为最近公共祖先,直接返回 root
  • 情况二:在右子树中找不到 p 或 q ( right == null ),那么说明 p 和 q 应都在左子树上,返回 left,在左子树中继续寻找
  • 情况三:在左子树中找不到 p 或 q ( left == null ),那么说明 p 和 q 应都在右子树上,返回 right,在右子树中继续寻找

若我们基于深度优先遍历的递归算法进行解题,那么还会出现一种情况:

  • 假如当 p 与当前节点相同时(p == root),那么 q 必然只能分布在其子树中,所以当前节点即为最近公共祖先,同理可得当(q == root)的情况。

通过分析最近公共祖先的三种基本情况,可知解题的关键在于递归分析节点 p 和 q 在每一个节点的左右子树分布情况,所以我们可以利用递归算法,优先对当前节点的左右子树进行深度优先遍历,通过左右子树的返回结果来确定当前节点是否为最近公共祖先。

Java解法(递归):

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root == null || p == root || q ==root)return root;TreeNode left = lowestCommonAncestor(root.left,p,q);TreeNode right = lowestCommonAncestor(root.right,p,q);return (right == null) ? left : (left == null) ? right : root;}
}
http://www.yayakq.cn/news/579793/

相关文章:

  • 商河网站建设上海全上海全国网站建设
  • wordpress安装网站吗网站开发分销系统
  • 如何给网站做seowordpress重新
  • 嘉兴网络项目建站公司公众号做成网站那样怎么做
  • 学校网站建设先进个人荣誉短网址生成怎么使用
  • 做触屏网站颍上网站建设
  • 广州公司网站提供盐城网站优化推广服务
  • 网站建设的实验小结清远做网站的
  • 网站营销工具wordpress html模板下载
  • 河间网站网站建设永久不收费的软件app
  • 做哪方面的网站好呢酒店网站建设方案书
  • 局域网多网站建设做图去哪个网站找素材
  • gta 买房网站建设中杭州网站建设公司联系方式
  • 2022年百度seo西安百度推广优化公司
  • 网站修改备案号WordPress首页怎么打开
  • 网站建设需要集齐哪5份资料整合营销传播案例分析
  • vs网站模板怎么做淘宝网站赚钱技巧
  • 新闻门户网站源码建设p2p网站
  • 检察 网站建设医院网站 整站源码
  • 网站开发优势互联网推广工资很高吗
  • 朋友做网站网站挣了好多钱免费发外链平台
  • 有免费搭建app的网站吗免费空间网站推荐
  • 医院网站开发违法吗制作广告网站的步骤
  • 成都网站建设的公司哪家好上海网站搜索优化
  • wordpress多站点功能公司的建设网站公司
  • 怎么用手机制作网站广州番禺区有什么大学
  • 株洲划定10个高风险区做seo网站不用域名
  • 微信网站价格做网站服务器电脑配置
  • 深圳 骏域网站建设百度小程序开发工具
  • 网站打不开dns修改雄安邯郸网站制作多少钱