当前位置: 首页 > 知识库问答 >
问题:

使用树实现堆

闾丘鸣
2023-03-14

关于这一点已经有很多问题(例如使用树实现堆),但是没有一个问题有一个公认的答案。所以,我在这里再问一次,让问题更清楚。< br >二叉树已经实现,并且二叉树的私有内部类包括

    T element;
    Node<T> parent;
    Node<T> leftChild;
    Node<T> rightChild;

所以,我有元素,父,左孩子,右孩子的引用。
内部类包含每个获取器和设置器。
内部类正在实现位置

size()//Returns size of tree
parent(Position<T> node)//return Position<T> of parent of node
left(Position<T> node)//return Position<T> of leftChild of node
right(Position<T> node)//return Position<T> of rightChild of node
numChildren(Position<T> node)//to return number of children of node

更新方法包括

 addRoot(T element)//element will be added as root if tree is empty
 addLeft(Position<T> position,T element)//Left child to be added at position
 addRight(Position<T> position,T element)//right child to be added at position
 set(Position<T> position,T element)//Element of positon will be changed to
                      //element passed in pareameter and previous element will be returned
 remove(Position<T> position)// position will be removed



所以,现在关于堆

[编辑]:我正在使用适配器模式在堆中实现的二叉树类

访问最后一个位置,我从root开始,然后检查它是否具有正确的子项,然后继续直到有小于2的子项并返回该位置,如果它没有右子项,则从左侧子级继续,其余过程是相同的。
现在,我有一个或零个子级的位置,现在我可以检查该位置的左侧是否为空,因此请添加到左侧,否则添加到右侧。

现在添加后,我必须检查堆顺序属性,如果它不符合,我必须上堆,现在的问题是我无法更改父
级 注意:我无法向二叉树添加新方法


共有1个答案

傅明知
2023-03-14

由于您在树中有一个大小()方法,并且您知道树是平衡的,因此您可以计算最后一个位置。

          1
        /   \
      2       3
     / \     / \
    4   5   6   7
   /
  8  ...

就是二进制的

               1
            /      \
         10           11
        / \          /  \
      100  101    110    111
      / \
   1000  1001  ... 

要从根到给定位置,您可以删除二进制表示中的第一个“1”,然后使用剩余数字从根向左(代表0)或向右(代表1)行走。因此,对于大小6=0101,您重新移动第一个“1”,留下“01”,这意味着向左,然后向右。

另请参见这个问题,这个问题在C中解决。

 类似资料:
  • kd树python实现 1. 首先在构造kd树的时需要寻找中位数,因此用快速排序来获取一个list中的中位数 import matplotlib.pyplot as plt import numpy as np class QuickSort(object): "Quick Sort to get medium number" def __init__(self, low, h

  • 本文向大家介绍asp.net使用DataGridTree实现下拉树的方法,包括了asp.net使用DataGridTree实现下拉树的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了asp.net使用DataGridTree实现下拉树的方法。分享给大家供大家参考。具体实现方法如下: 下拉树实现原理:输出json到客户端,客户端实现动态加载,中间不会和服务端交互。数据量支持上经测试几千还

  • 这是一个leetcode问题。 给定一个二叉树,返回其节点值的级序遍历(即从左到右,逐级)。 例如:给定二叉树, 将其级别顺序遍历返回为: 但我正在用JavaScript尝试一种新的方式,而不是完全按照他们的解决方案。到目前为止,我能够打印阵列,但 如何在新行中打印不同的级别 以下是我目前的代码: 输入:[3,9,20,空,空,15,7], LeetCode问题链接:BinarytreeTrave

  • 二叉搜索树依赖于在左子树中找到的键小于父节点的属性,并且在右子树中找到的键大于父代。 我们将这个称为 bst属性。 当我们如上所述实现 Map 接口时,bst 属性将指导我们的实现。 Figure 1说明了二叉搜索树的此属性,展示了没有任何关联值的键。请注意,该属性适用于每个父级和子级。 左子树中的所有键小于根中的键。 右子树中的所有键都大于根。 Figure1 现在你知道什么是二叉搜索树,我们将

  • 我得到了以下树: 然后我们被告知使用最后一个孩子/前一个兄弟姐妹方法来改变这三者的实现。这导致了以下结果: 我现在正在用Java实现来执行这棵树上的不同功能。我们有一个树接口和一个TreeNode接口。他们都有许多我们需要填写的功能。 节点是这样创建的: 树是这样创建的(使用根): 最后,节点被赋予兄弟姐妹子级,如下所示: 我已经为setChild、setSibling、getNextSiblin

  • 本文向大家介绍树莓派使用USB摄像头和motion实现监控,包括了树莓派使用USB摄像头和motion实现监控的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了树莓派使用USB摄像头和motion实现监控的具体代码,供大家参考,具体内容如下 一、工具 1、树莓派3B 2、USB摄像头 二、操作步骤 1、安装motion 2、配置motion (1) 将里面的no修改成yes,让moti