微信php网站开发流程娄底seo
web/
2025/9/30 1:13:55/
文章来源:
微信php网站开发流程,娄底seo,泰州智搜网络科技有限公司,windows7 花生壳做网站服务器二叉树第k个大的节点
二叉树文章列表#xff1a;
数据结构与算法–面试必问AVL树原理及实现
数据结构与算法–二叉树的深度问题
数据结构与算法–二叉堆#xff08;最大堆#xff0c;最小堆#xff09;实现及原理
数据结构与算法–二叉查找树转顺序排列双向链表
数据…二叉树第k个大的节点
二叉树文章列表
数据结构与算法–面试必问AVL树原理及实现
数据结构与算法–二叉树的深度问题
数据结构与算法–二叉堆最大堆最小堆实现及原理
数据结构与算法–二叉查找树转顺序排列双向链表
数据结构与算法-- 二叉树中和为某一值的路径
数据结构与算法-- 二叉树后续遍历序列校验
数据结构与算法-- 广度优先打印二叉树
数据结构与算法–解决问题的方法- 二叉树的的镜像
数据结构与算法–重建二叉树
数据结构与算法–二叉查找树实现原理
数据结构与算法–二叉树实现原理
数据结构与算法–B树原理及实现
数据结构与算法–数字在排序数组中出现次数
数据结构与算法–死磕二叉树
数据结构与算法–二叉树第k个大的节点
数据结构与算法–求1~n能组成的所有二叉搜索树的排列
之前遇到过多个类型的题型但是都是针对数组这种数据结构如果两篇
数据结构与算法–最小的k个数 数据结构与算法–查找与排序另类用法-旋转数组中的最小数字
其中最小k个数我们用二分法的思路很快得出解还有就是用二叉堆的特性求解在旋转数组中查找最小值直接二分查找完成由上可见二分法在数组中查找第k个大小的数还是很好用的。但是我们此处针对的是二叉排序树二分法可能排不上用处
方法一统计节点法 利用二叉排序数的特性左节点 比 根小 右节点比根大那么需要找第 k 大的,直接统计左右节点个数 如果右边节点个数 rightCount k那么第k 大的必然在右节点如果右节点个数 rightCount k那么有两种情况 当rightCount k 并且rightCount - k 1 此时最大的就是当前根节点如果rightCount k并且rigntCount- k 1 此时那么第 k 大的节点就是左节点的 k - rightCount - 1 个大的节点 我们依次筛选左右节点直到找到k 的具体节点或者父节点将k范围缩小到1或 0 当k 1 就是最右节点当k 0 就是最左节点。我们用如下图实例 情况一正好是root节点情况 情况二在left节点中 情况三在right节点中 经如上分析有如下代码
/*** 二叉搜索树中查找第 k 大的节点** author liaojiamin* Date:Created in 10:18 2021/7/16*/
public class FinMaxKNumberInBinary {public static void main(String[] args) {BinaryNode node new BinaryNode(null, null, null);BinarySearchTree searchTree new BinarySearchTree();Random random new Random();for (int i 0; i 5; i) {node searchTree.insert(random.nextInt(100), node);}searchTree.printTree(node);System.out.println();System.out.println(getMaxKNumber(node, 4).getElement());}/*** 遍历统计在比较*/public static BinaryNode getMaxKNumber(BinaryNode binaryNode, Integer k) {if (binaryNode null || k 0) {return null;}if (k 1) {BinaryNode right binaryNode;while (right.getRight() ! null) {right right.getRight();}return right;}if (k 0) {BinaryNode left binaryNode;while (left.getLeft() ! null) {left left.getLeft();}return left;}BinaryNode baseCount new BinaryNode(null, null, null);baseCount.setCount(0);int rightCount countNode(binaryNode.getRight(), baseCount).getCount();//第k大的在rightif (rightCount k) {return getMaxKNumber(binaryNode.getRight(), k);}//此时root节点是当前第 k大的数据if (k - rightCount 1) {return binaryNode;}//第k大的在leftif (k - rightCount 1) {return getMaxKNumber(binaryNode.getLeft(), k - rightCount - 1);}return null;}public static BinaryNode countNode(BinaryNode binaryNode, BinaryNode baseCount) {if (binaryNode null) {return baseCount;}baseCount.setCount(baseCount.getCount() 1);countNode(binaryNode.getLeft(), baseCount);countNode(binaryNode.getRight(), baseCount);return baseCount;}
}
以上实现方案中通过递归不断将 第 k大的节点范围缩小在最后的2个节点中找出我们的值问题在于存在太多重复的遍历如上情况三种当遍历右子树 C的时候其实已经遍历过 GF但是在之后的步骤中还依然需要遍历G F继续缩小范围因此时间效率很低
方法二逆中序遍历
还是利用二叉搜索树的特性我们需要找最大的第 k位置但是在二叉树三种遍历方式中前序中序后续遍历只有中序遍历是按顺序排列二叉搜索树的所有节点但是是小到大的顺序由此我们得到启发 我们利用中序遍历求第k个大的也就是从小到大排列的第 s - k 1 个数据但是此时我们并不知道二叉树的总节点无法得出这个值如果我们反过来遍历中序遍历是 左中右 我们换成 右根左那么直接求第k个位置的遍历到的节点就得到我们的解 因此最简单的遍历查找方式如下
/*** 二叉搜索树中查找第 k 大的节点** author liaojiamin* Date:Created in 10:18 2021/7/16*/
public class FinMaxKNumberInBinary {public static void main(String[] args) {BinaryNode node new BinaryNode(null, null, null);BinarySearchTree searchTree new BinarySearchTree();Random random new Random();for (int i 0; i 5; i) {node searchTree.insert(random.nextInt(100), node);}searchTree.printTree(node);System.out.println();System.out.println(getMaxKNumber(node, 4).getElement());System.out.println(getMaxKNumberOver(node, 4).getElement());}/*** 直接从最大的遍历同时统计遍历节点数当统计到k个则是第k个大*/public static BinaryNode getMaxKNumberOver(BinaryNode binaryNode, Integer k) {if (binaryNode null || k 0) {return null;}BinaryNode baseCount new BinaryNode(null, null, null);baseCount.setCount(0);return printOver(binaryNode, baseCount, k);}/*** 右 中 左方式遍历树与之前树遍历三种都不同*/public static BinaryNode printOver(BinaryNode node, BinaryNode baseCount, Integer k) {if(node null){return baseCount;}baseCount printOver(node.getRight(), baseCount, k);baseCount.setCount(baseCount.getCount() 1);if(baseCount.getCount() k){baseCount node;baseCount.setCount(k);return baseCount;}return printOver(node.getLeft(), baseCount, k);}
}上一篇数据结构与算法–再来聊聊数组 下一篇数据结构与算法–求1~n能组成的所有二叉搜索树的排列
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/84172.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!