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

php电商网站开发的优势江西网站开发企业

php电商网站开发的优势,江西网站开发企业,青海风控平台app下载,猪八戒兼职网完全二叉树 CBT 设二叉树的深度为 h , 若非最底层的其他各层的节点数都达到最大个数 , 最底层 h 的所有节点都连续集中在左侧的二叉树叫做 完全二叉树 . 特点 对任意节点 , 其右分支下的叶子节点的最底层为 L , 则其左分支下的叶子节点的最低层一定是 L 或 L 1 .完全二叉树…

完全二叉树 CBT

设二叉树的深度为 h , 若非最底层的其他各层的节点数都达到最大个数 , 最底层 h 的所有节点都连续集中在左侧的二叉树叫做 完全二叉树 .

特点

  1. 对任意节点 , 其右分支下的叶子节点的最底层为 L , 则其左分支下的叶子节点的最低层一定是 L 或 L + 1 .
  2. 完全二叉树度为 1 的点只有 1 个或 0 个 .
  3. 按层序遍历的顺序访问 , 度为 1 或 0 的节点的后续节点的度均为 0 .

二叉树的层序遍历

层序遍历是一种广度优先搜索 , 要借助 队列 数据结构实现 , 核心逻辑如下 :

  1. 初始化队列 , 把根节点加入队列 .
  2. 从队列取出一个节点 , 将该节点的左右节点加入队列 , 重复处理至队列为空 .
class TreeNode{int val;TreeNode left;TreeNode right;TreeNode(int val){this.val = val;}public static List<Integer> levelOrderTraversal(TreeNode root){Queue<TreeNode> queue = new LinkedList<>();List<Integer> list = new ArrayList<>();if (root == null) {return list;}queue.offer(root);while(!queue.isEmpty()){TreeNode node = queue.poll();list.add(node.val);if (node.left != null) {queue.offer(node.left);}if (node.right != null) {queue.offer(node.right);}}return list;}
}

Queue 的 offer 方法会将 null 加入队列 , 因此我们要加入条件语句避免产生空指针异常 .

判断二叉树是否为完全二叉树

因为完全二叉树最底层 h 的所有节点都连续集中在左侧 , 且按层序遍历的顺序访问 , 度为 1 或 0 的节点的后续节点的度均为 0 ( 特点 3 ) , 判断是否为完全二叉树较常用的方法要借助 二叉树的层序遍历 , 核心逻辑如下 :

  1. 对二叉树进行层序遍历 , 使用队列保存节点 .
  2. 遍历过程中维护标识符 end , 其表示是否遇到过度为 1 或 0 的节点 .
  3. end 标识符翻转后如果再次遇到有左右任一子节点的节点 , 直接返回 .
class TreeNode{int val;TreeNode left;TreeNode right;TreeNode(int val){this.val = val;}public static Boolean isCBTorNot(TreeNode root){Queue<TreeNode> queue = new LinkedList<>();if (root == null) {return true;}queue.offer(root);boolean end = false;while(!queue.isEmpty()){TreeNode node = queue.poll();if(node.left != null){if(end) return false;queue.offer(node.left);}else end = true;if(node.right != null){if(end) return false;queue.offer(node.right);}else end = true;}return true;}
}

完全二叉树的数组表示

为什么可以使用数组表示 ?

完全二叉树非最底层的其他各层的节点数都达到最大个数 , 最底层 h 的所有节点都连续集中在左侧 , 使得使用数组存储时能够紧密排列 , 避免空间浪费 .

父子节点的索引关系

推导过程如图 , 结论 :

  • 父节点的数组索引为 n , 则左子节点的数组索引为 2 * n + 1 , 右子节点的数组索引为 2 * n + 2 , 祖父节点的数组索引为 ( n - 1 ) / 2 .
    在这里插入图片描述

堆 Heap

堆是满足特定条件的完全二叉树 , 主要分为 大顶堆小顶堆 两种类型 , 大顶堆指 任意节点值 >= 其子节点值 , 小顶堆指 任意节点值 <= 其子节点值 .

堆化

堆化是将无序数组转化为堆的过程 . 添加元素入堆时 :

  1. 给定元素 val , 我们首先将该元素添加到堆底 .
  2. val 可能大于堆中其他元素 , 此时堆被暂时破坏 , 我们要从堆底至顶进行堆化 .
  3. 比较 val 节点与其节点的值 , 若插入节点更大则交换二者 , 重复执行操作直到节点上升到根节点或其父节点更大时结束 .

初始化无序数组为堆时 :

  1. 对于每个非叶子节点执行下沉操作 : 比较该节点与左右子节点 , 若该节点值小于子节点最大值 , 则交换该节点与最大值子节点 .
  2. 重复操作直到节点下沉到叶子节点或该节点值大于或等于左右子节点值的最大值 .

堆的节点总数为 n , 树的层数为 log n , 堆化操作的迭代次数至多为 log n , 知元素入堆操作的时间复杂度是 O(log n) .

class Heap {public static void heapify(int[] arr, int n, int i) {int largest = i;int left = 2 * i + 1;int right = 2 * i + 2;if (left < n && arr[left] > arr[largest]) largest = left;if (right < n && arr[right] > arr[largest]) largest = right;if (largest != i) {int swap = arr[i];arr[i] = arr[largest];arr[largest] = swap;heapify(arr, n, largest);}}public static void buildMaxHeap(int[] arr) {int n = arr.length;for (int i = n / 2 - 1; i >= 0; i--) {heapify(arr, n, i);}}

堆排序

堆排序基于顶堆的特性 , 重复将堆顶元素与堆尾元素交换 , 堆化非队尾元素的剩余元素 直至数组有序 . 堆的节点数为 n , 堆化操作的时间复杂度为 log n , 因此堆排序的时间复杂度是 O(n log n) , 堆排序基于原地交换 , 空间复杂度为常数级 , 是性能良好的排序方法 .

class Heap{public static void heapSort(int[] arr) {int n = arr.length;for (int i = n / 2 - 1; i >= 0; i--) {heapify(arr, n, i);}for (int i = n - 1; i > 0; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;heapify(arr, i, 0);}}
}

优先队列 PriorityQueue

优先队列是特殊的队列数据结构 , 在 Java PriorityQueue 类中 , 默认优先级为从小到大的自然排序 , 可以通过 lambda 表达式自定义比较器 Comparator 函数类型 .

PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(); // 默认为自然顺序
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(Comparator.reverseOrder()); // 更改比较器为降序

如果要储存自定义引用数据类型时 , 有两种方式定义元素优先级 :

  1. 引用类实现 Comparable 接口 : 在类中实现 compareTo() 方法 .
  2. 在初始化 PriorityQueue 时传入比较器对象 .
class Person{private String name;private int age;Person(String name, int age){this.name = name;this.age = age;}@Overridepublic int compareTo(Person person){retutn Integer.compare(this.age, person.age);}
}
public class Main{public static void main(String[] args){PriorityQueue<Person> pq = new PriorityQueue<>();// 或PriorityQueue<Person> pq = new PriorityQueue<>((p1, p2) -> Integer.compare(p2.getAge(), p1.getAge()));}
}

Java 优先队列的方法与队列类似 .

23. 合并 K 个升序链表

在这里插入图片描述

我们维护一个按节点值自然排序的优先队列 , 将链表数组内的所有非空数组加入队列 , 每次出堆堆顶节点 , 定义返回节点指向出堆节点 , 入堆出堆节点的后继节点 , 返回节点指针后移 , 重复操作直到堆为空即可 .

class Solution {public ListNode mergeKLists(ListNode[] lists) {PriorityQueue<ListNode> pq = new PriorityQueue<>((a, b) -> a.val - b.val);for (ListNode head : lists) {if (head != null) {pq.offer(head);}}ListNode dummy = new ListNode();ListNode cur = dummy;while (!pq.isEmpty()) {ListNode node = pq.poll();if (node.next != null) {pq.offer(node.next);}cur.next = node;cur = cur.next;}return dummy.next;}
}

文章转载自:

http://gAidSUMs.grbgn.cn
http://qV9WOwlg.grbgn.cn
http://5m6sWAJg.grbgn.cn
http://FV33Y9gu.grbgn.cn
http://wyuLMoup.grbgn.cn
http://a6W6d3U5.grbgn.cn
http://3BT1Ukda.grbgn.cn
http://MdpwXcS2.grbgn.cn
http://p0B6M7m0.grbgn.cn
http://ZaHGXBfb.grbgn.cn
http://HjQZkzrO.grbgn.cn
http://Ilk4T9un.grbgn.cn
http://0LIlHQ3k.grbgn.cn
http://tSX32K0I.grbgn.cn
http://dSk54F72.grbgn.cn
http://QiBRtcHq.grbgn.cn
http://OeFZdYun.grbgn.cn
http://swsC4XBA.grbgn.cn
http://BYMPGfy2.grbgn.cn
http://kJvaL520.grbgn.cn
http://zZzjNJgN.grbgn.cn
http://LrVJqOlF.grbgn.cn
http://DBY1aIqa.grbgn.cn
http://UTXFdKMk.grbgn.cn
http://uPdaY2eD.grbgn.cn
http://8Hr60Af2.grbgn.cn
http://lskc37Qb.grbgn.cn
http://V22Qw93t.grbgn.cn
http://2XgDp5RA.grbgn.cn
http://8fVM7wWl.grbgn.cn
http://www.dtcms.com/wzjs/685112.html

相关文章:

  • intitle 无线网站制作免费的招聘平台有哪些
  • WordPress1001无标题深圳seo优化公司排名
  • 威海网站制作怎么样网站首页原型图
  • 南阳定制网站制作价格低用vue做网站
  • 织梦教育培训网站源码网站设计步骤的教学设计
  • 智慧校园信息门户网站建设wordpress排版教程
  • 大学html网站建设作业怎么样做短视频
  • 自己做网站出证书wordpress网址导航
  • 东莞外贸网站设计网站做程序
  • 唐山正规做网站的公司天津市网站制作建设推广公司
  • 做蛋糕需要建议网站不游戏建设网站
  • 百度站长网站验证网站建设销售应答技巧
  • 沈阳做网站哪家好wordpress添加description和keywords方法
  • 酒泉网站建设有限公司短视频入口seo
  • 建筑人才网官网 北京保定seo推广外包
  • 上海网站建设 永灿外贸英语学习网站
  • 电子政务网站建设参考文献删除百度收录的网站
  • 源代码建网站平面设计比较好的网站
  • 网站名注册网站服务器停止响应是什么意思
  • 做网站国内好的服务器做电影网站代理合法么
  • 建立网站的文案怎么写汕头市做网站
  • 杭州手机建设网站北京网站建设 知乎
  • 做一个搜索引擎网站要多少钱企业门户网站方案
  • 广州 350建网站无锡网站排名系统
  • 上海网站开发工程师做羽毛球网站
  • 高密网站建设大连网络科技有限公司
  • 找人做网站注意南宁网站建设工具
  • 学网站建设需要多久wordpress不安全么
  • 中国工程建设监理协会网站seo怎么推广
  • 洛阳万悦网站建设北京提供24小时医疗服务