标签: binary-tree

二进制树的有序迭代器

我如何编写一个Java迭代器(即需要nexthasNext方法),它采用二叉树的根,并按顺序迭代二叉树的节点?

java algorithm binary-tree iterator nodes

25
推荐指数
1
解决办法
6万
查看次数

AVL树是邪恶的吗?

我正在阅读Steve Yegge关于单身人士的文章.在其中他提到他的老师告诉他AVL树是邪恶的.只是红色和黑色的树木是更好的解决方案吗?

algorithm binary-tree avl-tree red-black-tree

24
推荐指数
2
解决办法
5176
查看次数

只有一个节点的树的高度

根据维基百科,

树的高度是树中从根到最深节点的路径长度.只有一个节点(根)的(根)树的高度为零(或一).

我不明白 - 它是零还是一个(或两者)?

tree height binary-tree discrete-mathematics

24
推荐指数
3
解决办法
2万
查看次数

是否在深度优先搜索的二叉树上进行预排序遍历?

在我看来,Pre-order遍历和DFS与我们以深度方式遍历叶节点的两种情况相同.如果我错了,有人可以纠正我吗?

提前致谢!

algorithm tree binary-tree depth-first-search preorder

24
推荐指数
4
解决办法
3万
查看次数

用于产生两个间隔集合的差异的算法

问题

假设我有两个间隔集合,名为A和B.如何以最节省时间和内存效率的方式找到差异(相对补充)?

图片说明: 在此输入图像描述

间隔时间点是整数(≤2 128 -1),他们总是两个2 ñ长排列的M×2 ñ晶格(这样就可以使一个二叉树了出来).

间隔可以在输入中重叠,但这不会影响输出(如果平坦的结果相同,则结果).

问题是因为两个集合中都有多个间隔(最多100,000,000),所以天真的实现可能会很慢.

从两个文件中读取输入,并按照这样的方式对输入进行排序:较小的子间隔(如果重叠)紧接在父项之​​后按大小顺序排列.例如:

[0,7]
[0,3]
[4,7]
[4,5]
[8,15]
...
Run Code Online (Sandbox Code Playgroud)

我试过了什么?

到目前为止,我一直致力于生成二进制搜索树的实现,同时聚合[0,3],[4,7] => [0,7]两个集合中的相邻interval(),然后遍历第二个树并"碰撞"两个中存在的间隔(细分更大的必要时在第一个树中的间隔).

虽然这似乎适用于小型集合,但它需要越来越多的RAM来保存树本身,更不用说完成从树中插入和删除所需的时间.

我认为,由于间隔是预先排序的,我可以使用一些动态算法并在一次通过中完成.但是,我不确定这是否可行.


那么,我将如何以有效的方式解决这个问题呢?

免责声明:这不是作业,而是对我所面临的实际现实问题的修改/概括.我用C++编程,但我可以接受任何[命令式]语言的算法.

c++ language-agnostic algorithm binary-tree

23
推荐指数
3
解决办法
2285
查看次数

使用O(n)存储和O(log n)查询时间的数据结构应该用于范围最小查询?

我对算法类的以下作业问题感到难过:

假设我们给出了一个n值x 1,x 2 ... x n的序列,并寻求快速回答形式的重复查询:给定i和j,找到x i ... x j中的最小值

设计一个使用O(n)空间的数据结构,并在O(log n)时间内回答查询.

首先,我不确定一个序列是指一个有序集合,还是一个未排序的集合 - 但由于它没有说明,否则我会假设序列意味着未排序.

所以,我意识到这显然必须涉及二叉树,如果我们谈论的是O(log N)查找时间.所以基本上,我想,你有一个集合S,并将每个元素插入S到二叉树中.问题是,这个问题基本上要求我想出一种方法来回答查询,其中我将一系列索引分配到未排序的集合中 - 然后在O(log N)时间内确定该范围中的最低值.怎么可能?即使将每个数量的集合插入树中,我能做的最好的事情是在O(log N)时间内查找任何特定的数字.这不允许我在未排序的数字范围内找到最低值S.

有什么建议?

algorithm big-o binary-tree

22
推荐指数
2
解决办法
8022
查看次数

有序树遍历

我之前的一篇学术课程中有以下关于二阶(不是BST)的有序遍历(它们也称之为pancaking)的文本:

有序树遍历

在树的外面画一条线.从根的左侧开始,绕过树的外部,最后到根的右侧.尽可能靠近树,但不要越过树.(想想树 - 它的分支和节点 - 作为一个坚实的障碍.)节点的顺序是这条线在它们下面经过的顺序.如果您不确定何时"在节点下面",请记住"左侧"节点始终位于第一位.

这是使用的示例(从下面略微不同的树)

树1

但是,当我在谷歌搜索时,我得到一个相互矛盾的定义.例如维基百科的例子:

树的定义

顺序遍历序列:A,B,C,D,E,F,G,H,I(左子节点,根节点,右节点)

但根据(我的理解)定义#1,这应该是

A,B,D,C,E,F,G,I,H

任何人都可以澄清哪个定义是正确的?它们可能都描述了不同的遍历方法,但碰巧使用相同的名称.我很难相信同行评审的学术文本是错误的,但不能确定.

binary-tree tree-traversal data-structures

21
推荐指数
2
解决办法
6万
查看次数

可以使用N个密钥创建的二叉搜索树的可能数量由第N个加泰罗尼亚数给出.为什么?

这困扰了我一段时间.我知道,如果N键以二叉搜索树的形式排列,可以创建的树的可能数量对应于加泰罗尼亚序列中的第N个数字.

我一直试图确定这是为什么; 无法找到任何甚至可能试图直观地解释它的东西我诉诸于SO的集体知识.我找到了计算可能树木数量的其他方法,但它们似乎不太直观,除了如何使用它之外没有提供任何解释.加上维基页面(上面的链接)甚至可以显示带有3个键的可能树形图的图像,这将使我认为有一个很好的和整洁的解释可以被听到(不用说,不包括在文章中) ).

提前致谢!

math tree binary-tree binary-search

21
推荐指数
2
解决办法
1万
查看次数

代表树木的物体

C#(或.net)中是否有代表二叉树(或好奇心)和n-ary树的对象?

我不是在谈论表示树控件,而是作为模型对象.

如果没有,是否有任何良好的外部实现?

.net c# tree binary-tree

21
推荐指数
3
解决办法
2万
查看次数

确定所谓的二叉树是否包含循环的高效算法?

我最喜欢的面试问题之一是

在O(n)时间和O(1)空间中,确定链表是否包含循环.

这可以使用Floyd的循环寻找算法来完成.

我的问题是,在尝试检测二叉树是否包含循环时,是否可以获得如此好的时间和空间保证.也就是说,如果有人给你一个struct定义

struct node {
    node* left;
    node* right;
};
Run Code Online (Sandbox Code Playgroud)

您如何有效地验证给定结构确实是二叉树,而不是DAG或包含循环的图形?

是否存在一种算法,给定二叉树的根,可以确定该树是否包含O(n)时间并且优于O(n)空间的循环?显然,这可以使用标准DFS或BFS来完成,但这需要O(n)空间.可以在O(√n)空间内完成吗?O(log n)空间?或者(O圣)在O(1)空间?我很好奇,因为在链表的情况下,这可以在O(1)空间中完成,但我从未见过相应有效的算法.

algorithm big-o binary-tree cycle

21
推荐指数
2
解决办法
5776
查看次数