news 2026/6/19 16:26:25

D.二分查找-进阶——2476. 二叉搜索树最近节点查询

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
D.二分查找-进阶——2476. 二叉搜索树最近节点查询

题目链接:2476. 二叉搜索树最近节点查询(中等)

算法原理:

👉对应力扣题解

这题其实就是对模板的再次应用罢了👇

优选算法-二分:18.在排序数组中查找元素的第一个和最后一个位置

解法一:二分查找+层序遍历

133ms击败5.17%

时间复杂度O(Nlogn)

整体思路很简单👇

①通过层序遍历将树中的节点值提取出来

②排序后通过二分查找依次查找queries中每个数在树中的mini、maxi

具体思考过程

①在层序遍历的同时将树中的节点值摘到一个顺序表中

②由于需要给对应的queries找数,找数要是一次遍历要O(N)的时间复杂度,但是用二分查找只需要O(logN)的时间复杂度,且找的数恰好是queries的最左右端点模型找到的数,所以优先选择二分查找

③使用二分查找需要有序的前提,因此需要对顺序表排序

④层序遍历方法可参考下面的博客👇

Java数据结构——7.二叉树《干货笔记》

解法二:二分查找+中序遍历

117ms击败14.28%

时间复杂度O(Nlogn)

其实就是提取节点值的方法变了,层序遍历需要创建队列,类似BFS,咱们也可改成类似DFS的前序遍历、中序遍历、后序遍历

Java代码:

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { //解法一:二分查找+层序遍历 List<Integer> list=new ArrayList<>(); public List<List<Integer>> closestNodes(TreeNode root, List<Integer> queries) { List<List<Integer>> ret=new ArrayList<>(); //将树中的节点全部提取出来 bfs(root); Collections.sort(list); for(int x:queries){ List<Integer> tmp=new ArrayList<>(); //求最右端点模型找mini int left=0,right=list.size()-1; while(left<right){ int mid=left+(right-left+1)/2; if(list.get(mid)>x) right=mid-1; else left=mid; } //如果所有数都比x大,就添加-1进去 if(list.get(left)>x) tmp.add(-1); else tmp.add(list.get(left)); //求最左端点模型找maxi left=0;right=list.size()-1; while(left<right){ int mid=left+(right-left)/2; if(list.get(mid)<x) left=mid+1; else right=mid; } //如果所有数都比x小,就添加-1进去 if(list.get(left)<x) tmp.add(-1); else tmp.add(list.get(left)); ret.add(tmp); } return ret; } //层序遍历提取节点值 private void bfs(TreeNode node){ if(node==null) return; Queue<TreeNode> q=new LinkedList<>(); q.add(node); while(!q.isEmpty()){ TreeNode cur=q.poll(); list.add(cur.val); if(cur.left!=null) q.offer(cur.left); if(cur.right!=null) q.offer(cur.right); } } }
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { //解法二:二分查找+中序遍历 List<Integer> list=new ArrayList<>(); public List<List<Integer>> closestNodes(TreeNode root, List<Integer> queries) { List<List<Integer>> ret=new ArrayList<>(); //将树中的节点全部提取出来 dfs(root); Collections.sort(list); for(int x:queries){ List<Integer> tmp=new ArrayList<>(); //求最右端点模型找mini int left=0,right=list.size()-1; while(left<right){ int mid=left+(right-left+1)/2; if(list.get(mid)>x) right=mid-1; else left=mid; } //如果所有数都比x大,就添加-1进去 if(list.get(left)>x) tmp.add(-1); else tmp.add(list.get(left)); //求最左端点模型找maxi left=0;right=list.size()-1; while(left<right){ int mid=left+(right-left)/2; if(list.get(mid)<x) left=mid+1; else right=mid; } //如果所有数都比x小,就添加-1进去 if(list.get(left)<x) tmp.add(-1); else tmp.add(list.get(left)); ret.add(tmp); } return ret; } //中序遍历提取节点值 private void dfs(TreeNode node){ if(node==null) return ; dfs(node.left); list.add(node.val); dfs(node.right); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/18 22:53:39

MATLAB新手必看:5分钟搞定静电场边值问题仿真(附PDETOOL详细操作)

MATLAB静电场仿真实战&#xff1a;从入门到精通的PDETOOL指南 理工科学生和工程师们常常需要面对电磁场仿真的挑战&#xff0c;而静电场边值问题作为电磁学的基础课题之一&#xff0c;在实际工程应用中具有广泛价值。本文将带你深入探索MATLAB中PDETOOL工具的强大功能&#xff…

作者头像 李华
网站建设 2026/5/18 22:53:50

ComfyUI与Stable Diffusion 3高效部署实战指南

1. 为什么选择ComfyUIStable Diffusion 3组合 最近在折腾AI绘画工具时&#xff0c;我发现ComfyUI这个可视化节点工具配合Stable Diffusion 3&#xff08;SD3&#xff09;的效果出奇地好。相比传统的WebUI界面&#xff0c;ComfyUI最大的优势在于可视化工作流设计——你可以像搭积…

作者头像 李华
网站建设 2026/5/18 22:53:48

用SHAP打开工业AI黑盒:催化剂贡献度量化

用SHAP打开工业AI黑盒&#xff1a;催化剂贡献度量化 在工业AI应用中&#xff0c;模型可解释性是建立信任的关键。本文以催化剂产率预测为场景&#xff0c;结合SHAP&#xff08;Shapley Additive exPlanations&#xff09;方法&#xff0c;系统解构黑盒模型的决策逻辑。一、SHAP…

作者头像 李华