Tag: 二叉树

为什么使用二进制search,如果有三元search?

我最近听说三元search,我们把一个数组分成3个部分进行比较。 这里会有两个比较,但它将数组减less到n / 3。 为什么人们不用这么多?

在二进制search树中查找高度

我想知道是否有人可以帮我修改这个方法来find二叉search树的高度。 到目前为止,我的代码看起来像这样。 但是,我得到的答案是比实际的高度大1。但是,当我从我的返回语句中删除+1,它比实际的高度小1。我仍然试图围绕recursion与我的头这些BST。 任何帮助将非常感激。 public int findHeight(){ if(this.isEmpty()){ return 0; } else{ TreeNode<T> node = root; return findHeight(node); } } private int findHeight(TreeNode<T> aNode){ int heightLeft = 0; int heightRight = 0; if(aNode.left!=null) heightLeft = findHeight(aNode.left); if(aNode.right!=null) heightRight = findHeight(aNode.right); if(heightLeft > heightRight){ return heightLeft+1; } else{ return heightRight+1; } }

“完整的二叉树”,“严格的二叉树”,“全二叉树”之间的区别?

我对下面的树的术语感到困惑,我一直在研究这棵树,而我无法区分这些树: a)完整的二叉树 b)严格的二叉树 c)完整的二叉树 请帮我区分这些树木。 数据结构中何时何地使用这些树?

什么时候使用Preorder,Postorder和Inorder二叉search树遍历策略

我最近意识到,虽然在我的生活中使用了BST的丰富,但我从来没有想过使用除Inorder遍历之外的任何东西(虽然我意识到并知道如何使程序适应前/后顺序遍历)。 在意识到这一点之后,我拿出了一些旧的数据结构教科书,并在前序遍历和后序遍历的有用性之后寻找推理 – 虽然他们没有多说。 实际上什么时候使用前序/后序? 什么时候比有序更有意义?

使用恒定空间和O(n)运行时间编写二叉search树的非recursion遍历

这不是作业,这是面试的问题。 这里的问题是algorithm应该是恒定的空间。 对于如何在没有堆栈的情况下这样做,我是非常无能的,我会发布我使用堆栈写的东西,但是无论如何它都不相关。 以下是我所尝试的:我试图做一个前序遍历,并且到达了最左边的节点,但是我被困在那里。 我不知道如何在没有堆栈/父指针的情况下进行“recursion”备份。 任何帮助,将不胜感激。 (我把它标记为Java,因为这是我很舒服使用,但它是很明显的语言不可知论)。

检查二叉树是镜像还是对称

testing树是否对称的基本algorithm是什么? 因为它是一棵二叉树,所以我会假定它是一个recursion的sorting定义 正式的问题如下: 如果其左右子树是相同的镜像,即二叉树是对称的,则二叉树是其自身的镜像。 最好用几个例子来解释。 1 / \ 2 2 真正 1 / \ 2 2 \ 3 假 1 / \ 2 2 / \ / \ 4 3 3 4 真正 1 / \ 2 2 / \ / \ 3 4 3 4 假 1 / \ 2 2 / \ 3 […]

红黑树

我已经看到了最近几本书中提到的二叉树和二进制search,但由于我还在计算机科学的学习之初,我还没有select一门真正处理algorithm和数据的课程结构严重。 我已经检查了典型的资料来源(维基百科,谷歌),大部分描述了红黑树(特别是红黑树)的用途和实施,已经变得密集而难以理解。 我确信有必要的背景的人,这是完全合理的,但目前它几乎像一门外语。 那么是什么让二叉树在编程时发现自己在做的一些常见任务中有用呢? 除此之外,你更喜欢使用哪些树(请包括一个示例实现),为什么?

计算二叉search树中高度的最佳方法是什么? (平衡AVL树)

我正在寻找计算AVL树中节点平衡的最佳方法。 我以为我有它的工作,但经过一些沉重的插入/更新,我可以看到,它不工作正确(在所有)。 这是一个由两部分组成的问题,第一部分是如何计算子树的高度,我知道定义“节点的高度是从该节点到叶的最长下降path的长度“。 我明白了,但是我没能实施。 为了进一步使我迷惑,可以在维基百科树形高度上find这个引用。 “传统上,值-1对应于没有节点的子树,而零对应于具有一个节点的子树。 第二部分是在AVL树中获得子树的平衡因子,对于“得到L和R子树的高度并从L减去R ”这个概念我没有任何问题。 这是这样定义的: BALANCE = NODE[L][HEIGHT] – NODE[R][HEIGT] 在维基百科上阅读时,在描述插入AVL树的前几行中说: “如果平衡因子变成-1,0或1,那么树仍然是AVLforms,不需要旋转。 然后继续说: “如果平衡因子变成2或-2,那么以此节点为根的树就不平衡了,需要进行树的旋转,最多只需要一次或两次旋转来平衡树。 – 我没有任何困难抓住。 但是(是的,总有一个但是)。 这里是令人困惑的地方,文字指出“如果R的平衡因子是1,则意味着插入发生在该节点的(外部)右侧,并且需要左旋转” 。 但从理解的文字(正如我所引述的)所说,如果平衡因素在[-1, 1]之内[-1, 1]那么就不需要平衡了? 我感觉自己如此接近于理解这个概念,我已经把树轮旋转了下来,实现了一个普通的二叉search树,并且在抓AVL树的边缘,但是似乎缺less了那个重要的顿悟。 编辑:代码示例优于学术公式,因为我总是有更容易的时间抓住代码的东西,但任何帮助,非常感谢。 编辑:我希望我能标记所有的答案为“接受”,但对我来说,NIck的答案是第一个让我去“哈哈”。

B树比AVL还是RedBlack-Tree快?

我知道性能从来就不是黑白的,通常情况下X的执行速度更快,情况Y的执行速度更慢,但总的来说 – B树快于AVL或RedBlack-Trees? 他们实现AVL树(甚至可能是RedBlack-tree?)要复杂得多,但它们是否更快 (复杂性是否得到了回报)呢? 编辑:我还要补充说,如果他们更快,那么等效的AVL / RedBlack树(节点/内容) – 为什么他们更快?

是大O(logn)日志基础?

对于二进制search树型数据结构,我看到大O表示法通常记为O(logn)。 在日志中使用小写“l”,这是否意味着以自然对数描述的对数基数e(n)? 对不起,这个简单的问题,但我一直无法区分不同的暗示对数。