在二叉搜索树中查找中位数

2023-11-22

编写函数的实现T ComputeMedian() const在 O(n) 时间内计算树中的中值。假设该树是 BST,但不一定是平衡的。回想一下,n 个数字的中位数定义如下:如果 n 为奇数,则中位数为 x,使得小于 x 的值的数量等于大于 x 的值的数量。如果 n 是偶数,则小于 x 的值的数量加一等于大于 x 的值的数量。例如,给定数字 8、7、2、5、9,中位数为 7,因为有两个值小于 7,两个值大于 7。如果我们将数字 3 添加到集合中,则中位数变为 5。

这是二叉搜索树节点的类:

template <class T>
class BSTNode
{
public:
BSTNode(T& val, BSTNode* left, BSTNode* right);
~BSTNode();
T GetVal();
BSTNode* GetLeft();
BSTNode* GetRight();

private:
T val;
BSTNode* left;
BSTNode* right;  
BSTNode* parent; //ONLY INSERT IS READY TO UPDATE THIS MEMBER DATA
int depth, height;
friend class BST<T>;
};

二叉搜索树类:

template <class T>
class BST
{
public:
BST();
~BST();

bool Search(T& val);
bool Search(T& val, BSTNode<T>* node);
void Insert(T& val);
bool DeleteNode(T& val);

void BFT(void);
void PreorderDFT(void);
void PreorderDFT(BSTNode<T>* node);
void PostorderDFT(BSTNode<T>* node);
void InorderDFT(BSTNode<T>* node);
void ComputeNodeDepths(void);
void ComputeNodeHeights(void);
bool IsEmpty(void);
void Visit(BSTNode<T>* node);
void Clear(void);

private:
BSTNode<T> *root;
int depth;
int count;
BSTNode<T> *med; // I've added this member data.

void DelSingle(BSTNode<T>*& ptr);
void DelDoubleByCopying(BSTNode<T>* node);
void ComputeDepth(BSTNode<T>* node, BSTNode<T>* parent);
void ComputeHeight(BSTNode<T>* node);
void Clear(BSTNode<T>* node);

};

我知道我应该首先计算树的节点,然后进行中序遍历,直到到达第 (n/2) 个节点并返回它。我只是不知道怎么做。


正如您所提到的,首先找到节点数并进行任何遍历是相当容易的:

findNumNodes(node):
   if node == null:
       return 0
   return findNumNodes(node.left) + findNumNodes(node.right) + 1

然后,进行中序遍历,当节点数为 n/2 时中止:

// index is a global variable / class variable, or any other variable that is constant between all calls
index=0
findMedian(node):
   if node == null:
       return null
   cand = findMedian(node.left)
   if cand != null:
        return cand
   if index == n/2:
       return node
   index = index + 1
   return findMedian(node.right)

其思想是,中序遍历以排序的方式处理 BST 中的节点。因此,由于该树是 BST,因此i您处理的第一个节点是i按顺序排列第 th 个节点,这当然也适用于i==n/2,当你找到它时n/2th 节点,您将其返回。


作为旁注,您可以向 BST 添加功能来查找i有效地第 th 个元素(O(h), where h是树的高度),使用顺序统计树.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在二叉搜索树中查找中位数 的相关文章

  • Python 给定 k 个分区的整数分区

    我正在尝试寻找或开发Python 的整数分区代码 仅供参考 整数分区将给定整数 n 表示为小于 n 的整数之和 例如 整数5可以表示为4 1 3 2 3 1 1 2 2 1 2 1 1 1 1 1 1 1 1 我为此找到了许多解决方案 ht
  • 使用FFT算法计算

    给定在平面上的点 1 0 2 0 n 0 上发现的一组 n 个粒子电荷载流子 在 i 0 点发现的粒子电荷记为 Qi 作用在粒子上的力由以下公式给出 C is a Coulomb s constant 给出一个算法来计算 Fi 对于总复杂度
  • 如何在给定目标索引数组的情况下对数组进行就地排序?

    你如何对给定的数组进行排序arr in place给定目标索引数组ind 例如 var arr A B C D E F var ind 4 0 5 2 1 3 rearrange arr ind console log arr gt B E
  • 在 O(n) 时间内找到 n x n 矩阵中的局部最小值

    所以 这不是我的家庭作业问题 而是取自 coursera 算法和数据结构课程的未评分作业 现已完成 You are given an n by n grid of distinct numbers A number is a local m
  • 删除队列中的最后一个元素

    我需要删除队列的最后一个元素 我唯一可以使用的操作是 Peek 获取第一个元素而不删除它 Enqueue element 向队列末尾插入一个元素 Dequeue 删除第一个元素 IsEmpty true 或 false 队列是否为空 而且我
  • java数据结构模拟数据树

    我需要帮助定义使用什么方法 我有一个 SOAP 响应 给我一个 xml 文件 我需要在屏幕上显示 3 个相关列表 当您在第一个列表中选择一个项目时 相应的选择将出现在第二个列表中 依此类推 我只对从 xml 流中提取数据后如何有效地组织数据
  • 如何将无向图转换为 DAG?

    The 维基页面 http en wikipedia org wiki Directed acyclic graph Relation to other kinds of graphs says 任何无向图都可以通过为其顶点选择总顺序并将每
  • 恒定大小数组的运行中位数

    我正在尝试找到恒定大小数组的中位数 但数组总是在更新 我的意思是新号码被旧号码替换 我称这个过程为运行中位数 或者我们可以说动态中位数 这是我的代码 在代码内部 当 rand 函数生成 78 时 代码无法找到正确的中位数 78 41 67
  • 如何求小于给定数的最大2次方

    我需要找到小于给定数字的最大 2 次幂 我陷入困境 找不到任何解决方案 Code public class MathPow public int largestPowerOf2 int n int res 2 while res lt n
  • 有人可以解释以下异或属性

    我的一个论坛提到给定的数组n数字 arr 0 n 1 以下条件成立 is the xor运算符 f l r f 0 r f 0 l 1 where f l r arr l arr l 1 arr r 我检查了上面的数组数量和不同的值l an
  • 数组中连续元素的最大乘积

    我在现场面试的时候被问到了这个算法问题 由于没有要求我签署保密协议 我将其发布在这里寻求答案 给定一个数组REAL不包含 0 的数字 找到产生最大乘积的连续元素 该算法应在线性时间内运行 我考虑过以下方法 使用两个数组 第一个是利用DP思想
  • 如何仅使用单个数组在 JavaScript 中模拟调用堆栈

    我正在看维基百科页面 https en wikipedia org wiki Call stack在调用堆栈上 并尝试理解这个图像 据我所知 哈哈 const memory memory 0 3 top of stack pointer m
  • URL路径相似度/字符串相似度算法

    我的问题是我需要比较 URL 路径并推断它们是否相似 下面我提供了要处理的示例数据 GROUP 1 robots txt GROUP 2 bot html GROUP 3 phpMyAdmin 2 5 6 rc1 scripts setup
  • 计算两点之间的最短路线

    过去几周我一直在开发一款多人 HTML5 游戏 使用nodejs and websockets 我已经被这个问题困扰了一段时间 想象一下 我用数组实现了这个平铺地图 如下所示 1 or 棕色瓷砖 路上有障碍物 玩家无法通过 0 or 绿色瓷
  • 绘制多边形

    我正在使用 Google Maps API V3 根据路径绘制多边形 该路径是随机未排序坐标点 LatLng 的数组 这会产生以下形状 Polylines intersect Problem 由于多边形的形状取决于路径中点的顺序 因此如何对
  • 需要一种将网络块范围折叠为超集范围列表的算法

    我的数学不及格 我需要一种有效的方法将网络范围缩小为超集 例如如果我输入 IP 范围列表 1 1 1 1至2 2 2 5 1 1 1 2至2 2 2 4 10 5 5 5至155 5 5 5 10 5 5 6至10 5 5 7 我想返回以下
  • 给定一个具有多个重复条目的数组,找到一个重复条目 O(N) 时间和常数空间

    我们得到了一个大小为 N 的数组 其中包含 0 到 N 2 范围内的整数 包括 0 和 N 2 该数组可以有多个重复的条目 我们需要在 O N 时间和常量空间中找到重复条目之一 我正在考虑取数组中所有条目的乘积和总和 以及 0 到 N 2
  • Florian 的 Grisu2 算法如何工作?

    我遇到了一个关于将 double 转换为 ascii 的问题 经过搜索 我得到了 Florian 的论文 使用整数快速准确地打印浮点数 http www cs tufts edu nr cs257 archive florian loits
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它

随机推荐

  • 创建/获取自定义 kubernetes 资源

    我想用 go 创建一个自定义的 kubernetes 资源 该应用程序部署在kubernetes集群中 我想创建例如以下资源 apiVersion configuration konghq com v1 kind KongPlugin me
  • CouchDB从XMLHttpRequest跨域访问?

    目前 Web 应用程序需要提供某种跨域 HTTP 标头来访问其他域上的数据 http openfontlibrary org wiki Web Font linking and Cross Origin Resource Sharing 有
  • Xcode 6.1 上架构 x86_64 的未定义符号

    突然 Xcode 在编译时抛出了这个错误 Undefined symbols for architecture x86 64 OBJC CLASS Format referenced from objc class ref in WOExe
  • 如何在 C 中将无符号字符数组转换为十六进制字符串

    是否可以将无符号字符数组表示为字符串 当我搜索它时 我发现只有 memset 能够做到这一点 但是逐个字符 假设这不是正确的方法 有没有办法进行转换 上下文 我试图存储加密哈希函数的输出 该函数恰好是一个无符号字符数组 eg unsigne
  • Eclipse 中如何自动删除尾随空格?

    这个问题有两个部分 其中之一我已经有了答案 如何自动删除尾随空格从正在编辑的整个文件 gt 答案 使用任意编辑插件 可以设置为在任何保存到文件时执行此操作 如何自动删除尾随空格仅从我改变的线条来看 gt 这我不知道 希望得到任何帮助 我假设
  • 汇编语言有多不可移植,/真的/?

    我知道用汇编语言编写任何内容或将汇编语言添加到任何程序都会损害其可移植性 但是 有多糟糕呢 我的意思是 现在基本上所有 PC 都是 x86 或 x64 对吧 那么 如果我将汇编嵌入到 C 程序中 为什么无论它去了哪里它仍然无法编译 这种不可
  • 致命错误:Dictionary 不符合 Decodable,因为 Any 不符合 Decodable

    我正在尝试使用 swift 4 解析本地 json 文件 success true lastId null hasMore false foundEndpoint https endpoint error null 这是我正在使用的功能 f
  • 如何使单个事件处理程序处理所有 Button.Click 事件?

    在我的程序中 我有 9 个按钮 每个按钮都有 9 个独立的事件处理程序 尽管每个事件处理程序中的代码是相同的 事实证明 更改所有这些代码是非常乏味的 是否可以创建一个 Button Click 事件处理程序来处理所有按钮的 Button C
  • LLVM、GCC 4.2 和 Apple LLVM 编译器 3.1 之间的区别

    LLVM GCC 4 2 和 Apple LLVM 编译器 3 1 之间的主要区别是什么 我对编译器相当陌生 因此非常感谢您的帮助 此外 我对这两个编译器如何影响游戏性能特别感兴趣 差异在于技术和速度 当 Apple 开始从 GCC 的编译
  • Android Studio 上未安装 Android SDK

    根据我的最后一个问题 我从此链接下载了 Android Studio 不含 SDK 2 2 3 0 https dl google com dl android studio install 2 2 3 0 android studio i
  • boost序列化异常:未注册类,序列化多态基问题

    我一直在阅读 交叉引用 但最终没有找到连贯的例子和答案 我想做的事情非常简单 但我显然错过了一些东西 用英语 我有一个带有两个抽象基的类结构 纯 BB 派生自纯 AA 我将其管理为 std vector
  • 为什么我的旋转 GIF 在 jQuery ajax 调用运行时停止?

    我刚刚开始摆脱 ASP NET UpdatePanels 我使用 jQuery 和 jTemplates 将 Web 服务的结果绑定到网格 一切正常 事情是这样的 我试图在刷新表时显示一个旋转器 GIF 类似于 ASP NET 中的 Upd
  • Qt4 中的析构函数

    我对在 Qt4 中使用析构函数感到非常困惑 希望你们能帮助我 当我有这样的方法时 Des 是一个类 void Widget create Des test new Des test gt show 我怎样才能确保这个小部件在关闭后会被删除
  • NSOperationQueue 如何等待两个异步操作?

    如何让 NSOperationQueue 或其他任何东西 等待两个带有回调的异步网络调用 流程需要看起来像这样 Block Begins Network call with call back block begins first netw
  • pygtk 窗口,带有忽略所有 X(鼠标)事件的框(让它们通过)

    我想执行以下操作 创建一个全屏 始终位于顶部的 pygtk 窗口 其中包含显示一些 html 的 webkit 小部件 但带有一个完全透明的框 以便下面的窗口可见 这似乎是可能的 是否可以使用 WebKit 在清晰的背景上渲染网页内容 我想
  • 如何在 CLI 上运行 Maven 生成的 jar

    我正在尝试让 Maven 管理的项目在命令行上运行 我在 pom xml 中有一组依赖项 随后将其下载并安装在 m2 repository 中 我已在 pom 中包含必要的配置 以将类路径添加到 jar 清单中 现在的问题是我尝试运行该 j
  • 在Python中,如何从两个列表中找到常用单词,同时保留单词顺序?

    我正在尝试找到一种简单的方法来做到这一点 list1 little blue widget list2 there is a little blue cup on the table 我想获取两个列表的共同元素 list1 的顺序不变 所以
  • jQuery 在选择器中排除具有特定类的元素

    我想在 jQuery 中为某些锚标记设置点击事件触发器 我想在新选项卡中打开某些链接 同时忽略具有特定类别的链接 在您询问之前 我无法将类别放在我试图捕获的链接上 因为它们来自 CMS 我想排除与类的链接 button OR generic
  • 如何使用 XOM 传输 XML 数据?

    假设我想将大量搜索结果以 XML 的形式输出到 PrintWriter 或 OutputStream 中 使用XOM 生成的 XML 将如下所示
  • 在二叉搜索树中查找中位数

    编写函数的实现T ComputeMedian const在 O n 时间内计算树中的中值 假设该树是 BST 但不一定是平衡的 回想一下 n 个数字的中位数定义如下 如果 n 为奇数 则中位数为 x 使得小于 x 的值的数量等于大于 x 的