首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从二叉树到堆树的转换-陷入无限循环

基础概念

二叉树(Binary Tree)是一种树形数据结构,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。堆树(Heap Tree)是一种特殊的完全二叉树,其中每个节点的值都必须满足堆的性质。堆有两种主要类型:最大堆和最小堆。在最大堆中,父节点的值总是大于或等于其子节点的值;在最小堆中,父节点的值总是小于或等于其子节点的值。

转换过程

将二叉树转换为堆树的过程通常涉及以下步骤:

  1. 构建完全二叉树:确保二叉树是一个完全二叉树。如果不是,可以通过填充空节点来实现。
  2. 堆化(Heapify):从最后一个非叶子节点开始,逐步向上调整树的结构,使其满足堆的性质。

相关优势

  • 高效的优先级队列:堆树常用于实现优先级队列,插入和删除操作的时间复杂度为O(log n)。
  • 排序:堆排序是一种基于堆树的排序算法,时间复杂度为O(n log n)。

应用场景

  • 优先级调度:在操作系统中,进程调度通常使用堆来实现优先级调度。
  • 图算法:如Dijkstra算法中的最小堆优化。
  • 数据库索引:某些数据库系统使用堆来实现索引结构。

陷入无限循环的原因及解决方法

在将二叉树转换为堆树的过程中,可能会遇到陷入无限循环的情况。这通常是由于以下原因造成的:

  1. 错误的堆化逻辑:在堆化过程中,如果逻辑不正确,可能会导致节点不断被调整,从而陷入无限循环。
  2. 数据结构不一致:如果二叉树的结构在转换过程中被破坏,可能会导致无限循环。

解决方法

  1. 检查堆化逻辑:确保堆化逻辑正确,避免重复调整同一个节点。
  2. 维护数据结构一致性:在转换过程中,确保二叉树的结构不被破坏。

示例代码

以下是一个简单的Python示例,展示如何将二叉树转换为最大堆:

代码语言:txt
复制
class TreeNode:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None

def heapify(root):
    if not root:
        return
    
    # 找到最后一个非叶子节点
    last_node = root
    while last_node.left:
        last_node = last_node.left
    
    # 从最后一个非叶子节点开始堆化
    while last_node:
        parent = last_node
        child = parent.left if parent.left else parent.right
        
        if child and child.value > parent.value:
            parent.value, child.value = child.value, parent.value
        
        if parent == root:
            break
        
        last_node = parent.parent

# 示例用法
root = TreeNode(10)
root.left = TreeNode(5)
root.right = TreeNode(7)
root.left.left = TreeNode(3)
root.left.right = TreeNode(8)

heapify(root)

参考链接

通过以上步骤和示例代码,可以有效地将二叉树转换为堆树,并避免陷入无限循环的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【从二叉树到红黑树】清晰理解红黑树的演变---红黑的含义

(1).3-节点没有父节点,即整棵树就只有它一个三节点。此时,将3-节点扩充为一个4-节点,即包含三个元素的节点,然后将其分解,变成一棵二叉树。 ? 此时二叉树依然保持平衡。...(2).3-节点有一个2-节点的父节点,此时的操作是,3-节点扩充为4-节点,然后分解4-节点,然后将分解后的新树的父节点融入到2-节点的父节点中去。 ?...但是,将这种直白的表述写成代码实现起来并不方便,因为要处理的情况太多。这样需要维护两种不同类型的节点,将链接和其他信息从一个节点复制到另一个节点,将节点从一种类型转换为另一种类型等等。...红黑树 注:红黑数是平衡二叉树的一种,插入时遵循二叉树“左右”定律: 该父节点的左子节点:为小于父节点中且子树中最接近父节点值得数。 该父节点的右子节点:为大于父节点中且子树中最接近父节点值得数。...到这里,我们将需要证明的定理已经由 "一棵含有n个节点的红黑树的高度至多为2log(n+1)" 转变成只需要证明 "高度为h的红黑树,它的包含的内节点个数至少为 2bh(x)-1个"。

2.3K10

数据结构从入门到精通——二叉树的实现

,真正创建二叉树方式见下文 再看二叉树基本操作前,再回顾下二叉树的概念,二叉树是: 空树 非空:根节点,根节点的左子树、根节点的右子树组成的。...从概念中可以看出,二叉树定义是递归式的,因此后序基本操作中基本都是按照该概念实现的。 二、二叉树的遍历 2.1 前序、中序以及后序遍历 学习二叉树结构,最简单的方式就是遍历。...设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历...具体来说,从根节点开始,先访问所有相邻的子节点,然后逐层向下遍历,每访问一层的节点,就转向下一层,直到遍历完所有节点。这种遍历方法常用于二叉树、多叉树和图等数据结构。...在二叉树中,通常使用队列来实现层序遍历,首先将根节点入队,然后不断从队列中出队节点并访问,同时将该节点的子节点入队,直到队列为空。

15110
  • 【从二叉树到红黑树】清晰理解红黑树的演变---红黑的含义

    (1).3-节点没有父节点,即整棵树就只有它一个三节点。此时,将3-节点扩充为一个4-节点,即包含三个元素的节点,然后将其分解,变成一棵二叉树。 此时二叉树依然保持平衡。...(2).3-节点有一个2-节点的父节点,此时的操作是,3-节点扩充为4-节点,然后分解4-节点,然后将分解后的新树的父节点融入到2-节点的父节点中去。...但是,将这种直白的表述写成代码实现起来并不方便,因为要处理的情况太多。这样需要维护两种不同类型的节点,将链接和其他信息从一个节点复制到另一个节点,将节点从一种类型转换为另一种类型等等。...红黑树 注:红黑数是平衡二叉树的一种,插入时遵循二叉树“左右”定律: 该父节点的左子节点:为小于父节点中且子树中最接近父节点值得数。 该父节点的右子节点:为大于父节点中且子树中最接近父节点值得数。...到这里,我们将需要证明的定理已经由 "一棵含有n个节点的红黑树的高度至多为2log(n+1)" 转变成只需要证明 "高度为h的红黑树,它的包含的内节点个数至少为 2bh(x)-1个"。

    74041

    判断给定的序列是否是二叉树从根到叶的路径(递归)

    题目 给定一个二叉树,我们称从根节点到任意叶节点的任意路径中的节点值所构成的序列为该二叉树的一个 “有效序列” 。 检查一个给定的序列是否是给定二叉树的一个 “有效序列” 。...我们以整数数组 arr 的形式给出这个序列。 从根节点到任意叶节点的任意路径中的节点值所构成的序列都是这个二叉树的 “有效序列” 。 示例 1: ?...输入:root = [0,1,0,0,1,0,null,null,1,0,0], arr = [0,1,0,1] 输出:true 解释: 路径 0 -> 1 -> 0 -> 1 是一个“有效序列”(图中的绿色节点...其他的“有效序列”是: 0 -> 1 -> 1 -> 0 0 -> 0 -> 0 示例 2: ?...提示: 1 <= arr.length <= 5000 0 <= arr[i] <= 9 每个节点的值的取值范围是 [0 - 9] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com

    85800

    前端应该如何准备数据结构和算法?

    四、时间复杂度和空间复杂度 在开始学习之前,我们首先要搞懂时间复杂度和空间复杂度的概念,它们的高低共同决定着一段代码质量的好坏: 4.1 时间复杂度 一个算法的时间复杂度反映了程序运行从开始到结束所需要的时间...堆的底层实际上是一棵完全二叉树,可以用数组实现 每个的节点元素值不小于其子节点 - 最大堆 每个的节点元素值不大于其子节点 - 最小堆 堆在处理某些特殊场景时可以大大降低代码的时间复杂度,例如在庞大的数据中找到最大的几个数或者最小的几个数...冒泡排序 循环数组,比较当前元素和下一个元素,如果当前元素比下一个元素大,向上冒泡。下一次循环继续上面的操作,不循环已经排序好的数。 堆排序 创建一个大顶堆,大顶堆的堆顶一定是最大的元素。...为了确保递归函数不会导致无限循环,它应具有以下属性: 一个简单的基本案例 —— 能够不使用递归来产生答案的终止方案。 一组规则,也称作递推关系,可将所有其他情况拆分到基本案例。...二叉树的中序遍历 二叉树的最大深度 路径总和 课程表 岛屿数量 6.6 回溯算法 从解决问题每一步的所有可能选项里系统选择出一个可行的解决方案。 在某一步选择一个选项后,进入下一步,然后面临新的选项。

    80810

    一文梳理面试中的数据结构与算法

    四、时间复杂度和空间复杂度 在开始学习之前,我们首先要搞懂时间复杂度和空间复杂度的概念,它们的高低共同决定着一段代码质量的好坏: 4.1 时间复杂度 一个算法的时间复杂度反映了程序运行从开始到结束所需要的时间...堆的底层实际上是一棵完全二叉树,可以用数组实现 每个的节点元素值不小于其子节点 - 最大堆 每个的节点元素值不大于其子节点 - 最小堆 堆在处理某些特殊场景时可以大大降低代码的时间复杂度,例如在庞大的数据中找到最大的几个数或者最小的几个数...冒泡排序 循环数组,比较当前元素和下一个元素,如果当前元素比下一个元素大,向上冒泡。下一次循环继续上面的操作,不循环已经排序好的数。 堆排序 创建一个大顶堆,大顶堆的堆顶一定是最大的元素。...为了确保递归函数不会导致无限循环,它应具有以下属性: 一个简单的基本案例 —— 能够不使用递归来产生答案的终止方案。 一组规则,也称作递推关系,可将所有其他情况拆分到基本案例。...二叉树的中序遍历 二叉树的最大深度 路径总和 课程表 岛屿数量 6.6 回溯算法 从解决问题每一步的所有可能选项里系统选择出一个可行的解决方案。 在某一步选择一个选项后,进入下一步,然后面临新的选项。

    74820

    拿下 BAT+华为校招的 200 题 LeetCode 高频题库

    -打家劫舍 2(动态规划) 337-打家劫舍 3(树、深度) 416-分割等和子集(01背包---使用一维dp数组的话:外层循环只能是遍历物品,内层循环是从大到小遍历背包容量;遍历背包的顺序是从大到小.../从上到下打印二叉树 3(queue) 114-二叉树展开为链表(莫里斯遍历、后序变体、前序的栈方式) offer36-二叉搜索树与双向链表(中序遍历的框架) 538/1038-把二叉搜索树转换为累加树...-最大二叉树(递归,类似之前的重建二叉树) 108-将有序数组转换为二叉搜索树(采用递归的方式,跟最大的二叉树类似) 109-有序链表转换二叉搜索树(递归+快慢指针、中序遍历框架) offer68/235...(递归) 98-验证二叉搜索树(中序遍历的结果、递归的方式) 堆 题目 313-超级丑数(堆;动态规划) 378-有序矩阵中第 K 小的元素(堆,但是这个堆的用法其实就是排序,可以和合并k个排序链表总结到一块...(判断循环问题就用双指针;哈希表) 172-阶乘后的零(这题其实就是数学找规律差不多,进行转换。

    2.5K30

    数据结构与算法:堆

    结点的祖先是从根到该结点所经分支上的所有结点。 结点的层次(Level)从根开始定义起,根为第一层,根的孩子为第二层。若某结点在第L层,则其子树的根就在第L+1层。其双亲在同一层的结点互为堂兄弟。...对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。...则有n0=n2+1 具有n个节点的完全二叉树的深度为[log2n]+1 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有: 5....二叉树的顺序存储结构就是用一维数组存储二叉树中的结点,并且结点的存储位置,也就是数组的下标要能体现结点之间的逻辑关系,比如双亲与孩子的关系,左右兄弟的关系等 将这棵二叉树存入到数组中,相应的下标对应其同样的位置...下面详细说明这个过程: 当一个新元素被加入到堆中时,它首先被放置在堆的末尾(即作为树的最底层的最右侧的叶子节点),以保持完全二叉树的形状。

    29110

    前端应该如何准备数据结构和算法?

    四、时间复杂度和空间复杂度 在开始学习之前,我们首先要搞懂时间复杂度和空间复杂度的概念,它们的高低共同决定着一段代码质量的好坏: 4.1 时间复杂度 一个算法的时间复杂度反映了程序运行从开始到结束所需要的时间...堆的底层实际上是一棵完全二叉树,可以用数组实现 每个的节点元素值不小于其子节点 - 最大堆 每个的节点元素值不大于其子节点 - 最小堆 堆在处理某些特殊场景时可以大大降低代码的时间复杂度,例如在庞大的数据中找到最大的几个数或者最小的几个数...冒泡排序 循环数组,比较当前元素和下一个元素,如果当前元素比下一个元素大,向上冒泡。下一次循环继续上面的操作,不循环已经排序好的数。 堆排序 创建一个大顶堆,大顶堆的堆顶一定是最大的元素。...为了确保递归函数不会导致无限循环,它应具有以下属性: 一个简单的基本案例 —— 能够不使用递归来产生答案的终止方案。 一组规则,也称作递推关系,可将所有其他情况拆分到基本案例。...二叉树的中序遍历 二叉树的最大深度 路径总和 课程表 岛屿数量 6.6 回溯算法 从解决问题每一步的所有可能选项里系统选择出一个可行的解决方案。 在某一步选择一个选项后,进入下一步,然后面临新的选项。

    61920

    算法与数据结构(十四) 堆排序 (Swift 3.0版)

    看到堆排序这个名字我们就应该知道这种排序方式的特点,就是利用堆来讲我们的序列进行排序。“堆”其实就是一种有着特定结构的完全二叉树,下方将会详细的介绍一下堆。...在数据结构中的堆其实就是一颗“完全二叉树”,不过此完全二叉树有着一些特殊的规则,根据这些特殊的规则又可以将“堆”分为“大顶堆”和“小顶堆”。...首先我们先将上述序列从左往右存入完全二叉树中,如下所示。换一种方法来说,上述要排序的序列,也就是下方完全二叉树层次遍历的结果。 ?...2、“大顶堆”的转换 大顶堆的构建是从下往上进行调整的,确切的说是从局部到整体的来进行大顶堆的创建。在构建大顶堆的过程中,我们先从最小的子树开始调整,然后慢慢的往外扩充。...虽然上面是使用的完全二叉树进行表示的,但是我们在真正进行堆排序的时候并不会用到上述的完全二叉树的结构。仅仅用到了大顶堆层次遍历的序列。

    841100

    前端应该如何准备数据结构和算法?

    四、时间复杂度和空间复杂度 在开始学习之前,我们首先要搞懂时间复杂度和空间复杂度的概念,它们的高低共同决定着一段代码质量的好坏: 4.1 时间复杂度 一个算法的时间复杂度反映了程序运行从开始到结束所需要的时间...堆的底层实际上是一棵完全二叉树,可以用数组实现 每个的节点元素值不小于其子节点 - 最大堆 每个的节点元素值不大于其子节点 - 最小堆 堆在处理某些特殊场景时可以大大降低代码的时间复杂度,例如在庞大的数据中找到最大的几个数或者最小的几个数...冒泡排序 循环数组,比较当前元素和下一个元素,如果当前元素比下一个元素大,向上冒泡。下一次循环继续上面的操作,不循环已经排序好的数。 堆排序 创建一个大顶堆,大顶堆的堆顶一定是最大的元素。...为了确保递归函数不会导致无限循环,它应具有以下属性: 一个简单的基本案例 —— 能够不使用递归来产生答案的终止方案。 一组规则,也称作递推关系,可将所有其他情况拆分到基本案例。...二叉树的中序遍历 二叉树的最大深度 路径总和 课程表 岛屿数量 6.6 回溯算法 从解决问题每一步的所有可能选项里系统选择出一个可行的解决方案。 在某一步选择一个选项后,进入下一步,然后面临新的选项。

    98530

    必须掌握的八种排序(3-4)--简单选择排序,堆排序

    3、简单选择排序 (1)基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换; 然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。...在这里只讨论满足前者条件的堆。由堆的定义可以看出,堆顶元素(即第一个元素)必为最大项(大顶堆)。完全二叉树可以很直观地表示堆的结构。堆顶为根,其它为左子树、右子树。...,Kn.称为堆,当且仅当该序列满足特性: Ki≤K2i Ki ≤K2i+1(1≤ I≤[N/2]) * 堆实质上是满足如下性质的完全二叉树:树中任一非叶子结点的关键字均大于等于其孩子结点的关键字。...* 反之,若完全二叉树中任一非叶子结点的关键字均大于等于其孩子的关键字,则称之为大根堆。...创建初始堆 initialHeap(arr); /* * 对初始堆进行循环,且从最后一个节点开始,直到树只有两个节点止 每轮循环后丢弃最后一个叶子节点

    72890

    《算法设计与分析》学习笔记

    近似完全二叉树  深度为 d,只考虑深度为 d – 1 的部分是完全二叉树,深度为 d 的结点都在靠左部分。 堆 建堆 从n/2向下取整开始调整堆 建堆的代价为O(n)。...从已加入最小生成树的顶点集合中,选择一个顶点u,将与顶点u相连且权值最小的边(u, v)加入到候选边集合。...从候选边集合中选择权值最小的边(u, v),将顶点v加入到最小生成树的顶点集合中,同时将边(u, v)加入到最小生成树的边集合中。 重复步骤3和步骤4,直到最小生成树包含图中的所有顶点为止。...如果程序H返回"停机",那么程序D会进入一个无限循环;如果程序H进入无限循环,那么程序D会停机。 现在,我们将程序D作为自己的输入参数传递给程序D。...根据程序D的定义,它会模拟程序H的行为。如果程序H(此时是D自己)返回"停机",那么程序D会进入无限循环;如果程序H进入无限循环,那么程序D会停机。

    29320

    再谈堆排序:堆排序算法流程步骤透解—最大堆构建原理

    注意:堆一定是一棵完全二叉树先上一张堆排序动画演示图片:图、树、二叉树、二叉堆等基本概念,一时三刻讲不完,安利下本人整理的文章《讲透学烂二叉树一:树和图的概念以及二叉树的基本性质 》《讲透学烂二叉树一:...树和图的概念以及二叉树的基本性质》这里摘取二叉树排序需要的重点部分,再过一遍二叉树概述要了解堆首先得了解一下二叉树,在计算机科学中,二叉树是每个节点最多有两个子树的树结构。...(i) = 2i,i 的左子节点下标Right(i) = 2i + 1,i 的右子节点下标上面的转换为层序遍历Heapify堆化:将数组列表转换为堆(也称为“堆化”它)把数列的数值视为完全二叉树的结点(...从0开始)从倒数第二层开始,进行heapify,即父节点与子节点依次比较,把最大值交换到父节点以此类推,使这颗完全二叉树符合最大堆的性质建堆规律:父节点的下标 = (i-1)/ 2    例:数值7的下标为...)最小堆堆排序原理堆排序就是把最大堆堆顶的最大数取出,将剩余的堆继续调整为最大堆,再次将堆顶的最大数取出,这个过程持续到剩余数只有一个时结束。

    54130

    数据结构之堆

    堆 O(logn),最差情况下 O(logn),最差情况下 2、完全二叉树,把元素顺序排列成树的形状。当我们把元素一层一层的排列成二叉树的形状的时候,得到的这棵树就是完全二叉树。   ...4、向堆中添加元素和Sift Up,从用户的角度来看是添加元素,从堆的角度来看,设计到一个非常基础的内部的操作,通常英文叫做Sift Up(堆中元素的上浮)。 ?...最大堆,我们从堆中取出元素只取出堆顶的这个元素,也就是二叉树的根节点所在的这个元素,这个元素是堆中存储元素最大的元素,取出操作只能取出这个元素,而不能取出其他的元素,根节点很好访问,就是对于数组来说,索引为...此时是循环一百万次,是对堆进行了一遍排序,从大到小进行排序的。...此时是循环一百万次,是对堆进行了一遍排序,从大到小进行排序的。

    63240

    二分查找树

    树的高度(或称为深度):树越深(高),从根节点(最大类)到叶子节点(目标物)的路径也就越长,也就意味着时间开销越大。...研究问题都讲究由简到繁,那就让我们先来看看最简单的情形——分岔数最小的情形——二叉树。 二叉树的每层节点只有两个节点,这表示只有两个小类。定位属于哪个小类时,需要做比较。...二分查找树的数学思想 将二分查找树从根节点(最大类)到叶子节点(目标物)的路径扒出来,垂直放置之后就如下图左部所示。再倒”下来水平放置之后,就如下图右部所示。 ?...由此可以看出,从最大类到目标物的查找过程,其实就是从大类不断逼近目标物的过程。 这个思想的本质其实就是数学的“逼近法”——不断缩小范围、直至不可再小,最终剩下的即为所求。...还是根据《史上最猛之递归屠龙奥义》一文中的老套路,转换成非递归版本: ? 整个算法的时间开销主要由do-while循环体的循环次数决定。很显然,在最坏情况下,循环次数等于二叉查找树的高度。

    87020

    二叉树的顺序存储结构

    二叉树的顺序存储结构:: 二叉树的顺序结构 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结 构存储。...现实中我们通常把堆 ( 一种二叉树 ) 使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。...,则称之为小堆(或大堆),将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。 堆的性质: 1.堆中某个节点的值总是不大于或不小于其父节点的值. 2.堆总是一颗完全二叉树.  ...根节点左右子树不是堆,我们怎么调整呢?这里我们从倒数的第一个非叶子节点的子树开始调整,一直调整到根节点的树,就可以调整成堆。...; //不要用while(parent>=0)作继续条件 当child=0时 parent仍为0 程序陷入死循环 while (child > 0) { //小于改大于变大堆 if (a[

    41520

    【Leetcode -617.合并二叉树 -1022.从根到叶的二进制数之和】

    Leetcode -617.合并二叉树 题目:给你两棵二叉树: root1 和 root2 。 想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。...你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。 返回合并后的二叉树。...注意 : 合并过程必须从两个树的根节点开始。...} Leetcode -1022.从根到叶的二进制数之和 题目:给出一棵二叉树,其上每个结点的值都是 0 或 1 。...每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。 例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数 01101,也就是 13 。

    10610

    关于“堆”,看看这篇文章就够了(附堆的两种应用场景)

    (小堆) 堆总是一棵完全二叉树 堆在实现时的基本功能有 入堆、出堆、查看堆顶元素及大小、判空 等,不过堆通常不单独使用,常常是作为一种辅助结构来处理现实中的问题,比如堆排序和Top-K问题 可以把堆进行理想化处理...事实上,将上图规范化,就能得到一个堆的逻辑结构图 原则二:堆总是一棵完全二叉树 完全二叉树指二叉树的前n-1层是满的,最后一层可以不满,但是要求树的节点从左到右都是连续的(递增或相等),比如上图中的就是一棵完全二叉树...,判断是否为完全二叉树的关键为节点是否连续 知道这两条原则后,堆就算是入门了,不过堆在计算机中并不是直接以完全二叉树的形式存储的,而是以这种形式[68, 40, 44, 18, 16, 24],没错,堆的真实物理结构是数组...,逻辑结构(完全二叉树)只是为了让我们更好的理解堆,因此我们在实现堆时,需要借助顺序结构,画图理解时,可以画成完全二叉树的形式 Tips:堆为何必须是完全二叉树?...因为完全二叉树是必然连续的,完美符合数组连续存储的特性 可以避免不必要的索引浪费,这是提高效率的关键 后续在取堆顶元素、入堆、出堆时也比较直观 实现堆 结构 堆底层是顺序表,因此在定义堆结构时,可以复用顺序表的代码

    1K20

    数据结构-二叉树(1)

    节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推; 树的高度或深度:树中节点的最大层次; 如上图:树的高度为4....堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点. 节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先....对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。...对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有: 1....3.2 堆的概念及结构 堆的性质: 堆中某个节点的值总是不大于或不小于其父节点的值; 堆总是一棵完全二叉树。 3.3 堆的实现 3.3.1堆的定义 堆的底层可以定义一个数组。

    15110

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券