Questions tagged «binary-trees»

一棵树,其中每个节点最多有两个子节点



1
哈希表与二叉树
当实现字典时(“我想通过他们的客户ID查找客户数据”),使用的典型数据结构是哈希表和二进制搜索树。例如,我知道C ++ STL库使用(平衡的)二进制搜索树实现字典(它们称为地图),而.NET框架在后台使用哈希表。 这些数据结构的优缺点是什么?在某些情况下还有其他合理的选择吗? 请注意,对于键具有强大的基础结构的情况,例如,它们都是1到n之间的整数或类似的东西,我并不特别感兴趣。

2
并非所有的红黑树都是平衡的?
直观地,“平衡树”应该是每个节点的左右子树必须具有“大约相同”数目的节点的树。 当然,当我们谈论红黑树*(请参阅最后的定义)时,实际上是指它们在高度上是平衡的,从某种意义上说,它们是平衡的。 假设我们尝试将上述直觉形式化如下: 定义:二叉树被称为μμ\mu -balanced,具有0≤μ≤120≤μ≤120 \le \mu \leq \frac{1}{2},如果对于每个节点,不等式NNN μ≤|NL|+1|N|+1≤1−μμ≤|NL|+1|N|+1≤1−μ \mu \le \frac{|N_L| + 1}{|N| + 1} \le 1 - \mu 对于每个,都有一个节点,上面的语句失败。是和的左子树中的节点数。是树下以为根(包括根)的节点数。μ′>μμ′>μ\mu' \gt \mu|NL||NL||N_L|NNN|N||N||N|NNN 我相信,在有关此主题的一些文献中,这些树被称为重量平衡树。 可以证明,如果具有节点的二叉树是平衡的(对于常数),那么树的高度是,因此保持了很好的搜索属性。nnnμμ\muμ>0μ>0\mu \gt 0O(logn)O(log⁡n)\mathcal{O}(\log n) 所以问题是: 是否有一些使每个足够大的红黑树达到平衡?μ>0μ>0\mu \gt 0μμ\mu 我们使用的Red-Black树的定义(来自Cormen等人的Introduction to Algorithms): 二进制搜索树,其中每个节点的颜色为红色或黑色, 根是黑色的 所有NULL节点均为黑色 如果节点为红色,则其两个子节点均为黑色。 对于每个节点,从该节点到后代NULL节点的所有路径都具有相同数量的黑色节点。 注意:在上面的 balanced 的定义中,我们不计算NULL节点。(尽管我相信这是否重要)。μμ\mu

1
顺序前,顺序后和顺序中的哪些组合是唯一的?
我们知道订单, post L(x) => [x] post N(x,l,r) => (post l) ++ (post r) ++ [x] 和预购 pre L(x) => [x] pre N(x,l,r) => [x] ++ (pre l) ++ (pre r) 和有序遍历 顺序化。 in L(x) => [x] in N(x,l,r) => (in l) ++ [x] ++ (in r) 即使我们假定成对的不同键/标签,也可以很容易地看出它们都不是唯一描述给定的树。 为此可以使用这三种的哪些组合,哪些不能使用? 肯定的答案应该包括(有效的)算法来重建树,并证明(正确的)原因。否定答案应提供反例,即具有相同表示形式的不同树。

2
计数二叉树
(我是一名具有一定数学背景的学生,我想知道如何计算特定种类的二叉树的数量。) 综观对维基百科页面二叉树的,我已经注意到了这个说法,即大小的扎根二叉树的数量应该是这样的加泰罗尼亚号码: C_N = \ dfrac {1} {N + 1} {2N \选择N}nnnCn=1n+1(2nn)Cn=1n+1(2nn)C_n = \dfrac{1}{n+1}{2n \choose n} 但是我不明白我自己怎么能得出这样的结果?有找到这种结果的方法吗? 现在,如果不考虑子树的顺序(左,右)?例如,从我的角度来看,我认为这两棵树是相同的: /\ /\ /\ /\ 是否可以应用类似的方法来计算这些对象中有多少个恰好具有nnn节点?

1
平衡二叉树的两种定义
我已经看到了平衡二叉树的两个定义,它们对我来说看起来有所不同。 如果二叉树认为每个节点的左子树中的内部节点数与右子树中的内部节点数最多相差1,则该树是平衡的。 如果对于任何两个叶子,深度差最大为1,则二叉树是平衡的。 是否满足def的每棵树。1也满足def。2?反过来呢?

1
为什么展开树旋转算法会同时考虑父节点和祖父母节点?
我不太了解为什么splay树数据结构中的轮换不仅要考虑评级节点的父级,还要考虑祖父母(zig-zag和zig-zig操作)。为什么以下方法不起作用: 例如,当我们插入树的新节点时,我们检查是否插入到左或右子树中。如果插入到左侧,则将结果向右旋转,反之亦然,将右子树旋转。递归就是这样 Tree insert(Tree root, Key k){ if(k < root.key){ root.setLeft(insert(root.getLeft(), key); return rotateRight(root); } //vice versa for right subtree } 那应该避免整个“花花公子”程序,你不觉得吗?

1
AVL树不平衡吗?
在上一个问题中,有一个平衡树的定义和一个关于红黑树的问题。 这个问题是要问同样的问题,但对于AVL树。 问题是,鉴于平衡树的定义与其他问题相同,μμ\mu 是否有一些使所有足够大的AVL树达到平衡?μμ > 0μ>0\mu \gt 0μμ\mu 我认为AVL树只有一种定义,没有歧义。

2
创建自排序二叉树
我有一个作业,需要使用二叉搜索树并将其更改为自身自定序,以使访问最多(优先级更高)的项目位于树的顶部,根是访问最多的节点。 教授给了我可以使用的BST和节点结构,但是在插入事物时试图让我的脑袋绕开更新树的算法,这使我感到困惑。 我知道随着插入的进行,它会检查当前节点的数据是否小于或大于当前节点,然后递归地以正确的方向运行,直到找到空指针并将其自身插入那里。并将其插入后将优先级增加1。 template <class Type> void BinarySearchTree<Type> :: insert( const Type & x, BinaryNode<Type> * & t ) { if( t == NULL ) t = new BinaryNode<Type>( x, NULL, NULL ); else if( x < t->element ) insert( x, t->left ); else if( t->element < x ) insert( …

5
有效压缩未标记的树木
考虑未标记的,有根的二叉树。我们可以压缩这些树:每当有指向子树TŤT和T′Ť′T'与T=T′Ť=Ť′T = T'(解释===为结构相等),我们店(wlog)TŤT并更换所有指针T′Ť′T'与指针TŤT。有关示例,请参见uli的答案。 给出一种将上述意义上的树作为输入并计算压缩后剩余的(最小)节点数的算法。该算法应在时间O(nlogn)Ø(ñ日志⁡ñ)\cal{O}(n\log n)(在统一成本模型中)运行,输入中的节点数为nñn。 这是一个考试问题,我无法提出一个很好的解决方案,也没有看到一个解决方案。

2
Google Code Jam长城问题是否有更快的解决方案
考虑以下Google Code Jam回合1C问题: 中国的长城始于一条无限的线,所有位置的高度均为。000 一些部落,会根据以下参数攻击墙壁:开始日,开始强度,开始西坐标和开始东坐标。这第一次攻击发生在一天,上范围,在强度。如果中有长城的任何部分的高度,则攻击成功,并且在一天结束时,将建造长城,以使其在高度会处于高度Ñ ≤ 1000 d 小号W¯¯ é d [ w ^ ,ë ] 小号[ w ^ ,ë ] &lt; 小号[ w ^ ,ë ] &lt; 小号小号NNNN≤1000N≤1000N \le 1000DDDSSSWWWEEEDDD[W,E][W,E][W,E]SSS[W,E][W,E][W,E]&lt;S&lt;S< S[W,E][W,E][W,E]&lt;S&lt;S< SSSS(或更大,如果当天其他一些攻击以强度击中同一段)S′&gt;SS′&gt;SS' > S 每个部落在撤退之前将进行多达攻击,并且每次攻击都将根据之前的迭代来确定。每个部落都有一些,和\ delta_S来确定攻击顺序:两次攻击之间将等待\ delta_D \ ge 1天,对于每次攻击,他们将移动其攻击范围\ delta_X单位(负=西,正=东部),但范围的大小将保持不变,并且每次攻击后它们的强度也会以恒定值增加/减少。δ d δ X δ 小号δ d ≥ 1 …

2
将二叉树上色为红黑树
常见的采访问题是给出一种算法,以确定给定的二叉树是否高度平衡(AVL树定义)。 我想知道我们是否可以对红黑树做类似的事情。 给定一个任意的未着色的二叉树(具有NULL节点),是否存在一种“快速”算法,该算法可以确定我们是否可以对节点Red / Black进行着色(并查找着色),以便它们满足Red-Black树的所有属性(这个问题的定义)? 最初的想法是,我们可以删除NULL节点,然后尝试递归地验证生成的树是否可以是一棵红黑树,但这似乎没有任何用处。 我在网上做了简短的搜索,但是似乎找不到任何可以解决这个问题的文件。 我可能错过了一些简单的东西。

2
证明二元堆具有
我想证明一个二元堆与nnn节点正好有假设以下列方式构建堆,那么将保留 2片叶子:⌈n2⌉⌈n2⌉\left\lceil \frac{n}{2} \right\rceil 通过percolate up插入每个新节点。这意味着必须在下一个可用子节点上创建每个新节点。我的意思是,孩子们从下到上,从左到右地被填充。例如,以下堆: 0 / \ 1 2 将有已建成的顺序为:0,1,2,(这些数字仅仅是索引,他们没有给出该节点所包含的实际数据的指示。) 这有两个重要含义: 没有完全填充级别k,在级别上将不存在任何节点k+1k+1k+1kkk 因为子级是从左到右构建的,所以在级别上的节点之间不能有“空白空间” ,或者类似以下情况: k+1k+1k+1 0 / \ 1 2 / \ \ 3 4 6 (根据我的定义,这将是非法的堆。)因此,考虑该堆的一个好方法是堆的数组实现,其中数组的索引中不能有任何“跳转”。 因此,我认为归纳法可能是实现此目的的一种好方法……也许某些事情甚至需要处理n的奇数情况。例如,使用这样的事实进行归纳,即以这种方式构建的偶数堆必须具有一个带有偶数n的子节点的内部节点,而没有奇数n的此类节点。有想法吗?

2
传播输入的功能
我想知道从n位数字到n位数字的函数fff是否具有以下特征: fff应该是双射的 无论fff和f−1f−1f^{-1}应该是可计算的相当快 fff应该返回与其输入没有显着相关性的数字。 原因是: 我想编写一个对数据进行操作的程序。数据的某些信息存储在二进制搜索树中,其中搜索关键字是字母的符号。随着时间的流逝,我在字母表中添加了更多符号。新符号只是获得下一个可用的免费号码。因此,树将始终对较小的键具有较小的偏差,这将导致比我认为需要的更多的重新平衡。 我的想法是与到裂伤符号数fff使得它们的整个范围内的广泛普及[0,264−1][0,264−1][0,2^{64}-1]。由于符号号仅在输入和输出期间才有关系,而符号输入只发生一次,因此应用此功能应该不会太昂贵。 我曾考虑过Xorshift随机数生成器的一次迭代,但是尽管从理论上讲应该是可行的,但我真的不知道一种撤消它的方法。 有人知道这样的功能吗? 这是一个好主意吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.