标签: binary-tree

在 O(1) 中确定基于数组的二叉树中的最低子节点(具有最大索引的后代)?

一些二叉树结构(例如堆)可以通过设置从左到右、从上到下的索引来使用数组来实现

           0
      /\
     1 2
   / \ / \
  3 4 5 6
 / \ / \ / \ / \
7 8 9 10 11 12 13 14
       ... ETC。

x可以在 O(1) 中轻松找到索引处节点的子节点和父节点:

左孩子(x) = 2x+1
儿童权利(x) = 2x+2
父级(x) = (x-1)/2

但是有没有办法在 O(1) 中找到 x 的最低后代 (即具有最高索引的后代)?例如,在上面的树中, 的最低后代x=0将是 14,而 forx=1则是10。请注意,对于x=1,如果树中只有 10 个元素,则它应该返回9

我可以假设我的数组中的元素永远不会超过 2 32 个,因此可以使用位移位在 O(1) 中实现2 n 。也有可能log_2(???)

arrays algorithm math binary-tree data-structures

5
推荐指数
1
解决办法
465
查看次数

从中序和层序遍历构造二叉树

首先,我想声明这不是家庭作业。我正在准备面试并遇到这个问题。我想我们可以通过中序级序遍历的定义。:-)。

例如:

      50
   /      \
 10        60
/  \       /  \
5   20    55    70
        /     /  \
      51     65    80
Run Code Online (Sandbox Code Playgroud)

上述树的中序和层序遍历为:

5、10、20、50、51、55、60、65、70、80

50, 10, 60, 5, 20, 55, 70, 51, 65, 80

我的点子:

(1) 遍历层序数组,找出出现在有序数组中的第一个元素。我们称这个元素为当前根。

(2) 在有序数组中找到当前根的索引。中序数组由索引分隔。中序数组的左边是当前根的左子树,中序数组的右边是当前根的右子树。

(3) 将有序数组更新为左边,然后转到步骤1。

(4) 将中序数组更新为其右侧,然后转到步骤2。

以上面的树为例。

(1) 5 is the first element appears in the in-order array. 

(2) [50 ...60] is the left sub-tree of 5 and [20 ... 80] is the right sub-tree of 5. 

(3) update the …
Run Code Online (Sandbox Code Playgroud)

binary-tree inorder data-structures

5
推荐指数
1
解决办法
4177
查看次数

概括二叉树遍历的动作?

我试图找到一种方法,我可以采用二叉树类并遍历其节点,在每个节点上
执行X数量的内联操作,而不必一遍又一遍地重写相同的遍历代码。
我想如果Java允许函数指针,这对我来说会更容易弄清楚......

基本上,我需要的是以下内容:

public class BinaryTreeNode {

    //...

    public void inOrderTraversalFrom(BinaryTreeNode node, /* ??? */ actions) {
        if(node.left != null)
            inOrderTraversalFrom(node.left);

        /* do something with "actions" here */

        if(node.right != null)
            inOrderTraversalFrom(node.right);
    }
}
Run Code Online (Sandbox Code Playgroud)


...其中动作可以允许执行不同的方法,根据要在每个节点上执行的动作类型采用不同的参数集

一个很好的例子是可以传递一个用于绘制这些节点的类,接受一个 Graphics 对象作为它的参数之一,而不是一个用于执行一些其他不需要 Graphics 的系列操作的类对象作为参数,而是一组完全不同的参数。

这怎么可能?执行此操作的最动态方式是什么?

java generics methods binary-tree function

5
推荐指数
1
解决办法
268
查看次数

使用旋转的二叉树变换

当我在学习关于二叉树的期中考试时,我发现了一个陈述,即任何任意的 n 节点二叉树都可以转换为最多 2*n-2 次旋转的任何其他 n 节点二叉树。有什么证据吗?我用渐近符号找到了某种证明,但不是那么清楚。我的意思是有人可以解释/说明为什么这是真的吗?如果它说 n 节点二叉树,它是否包括根?

algorithm math binary-tree data-structures tree-rotation

5
推荐指数
1
解决办法
4025
查看次数

从二叉树中删除重复项

我试图想出一种从二叉树/二叉搜索树中删除重复项的算法。到目前为止我能想到的最好的是

将树的中序遍历存储在数组中。
如果树没有排序,则对数组进行排序。
从数组中删除重复项并重建二叉树。

我们是否还需要存储树的前序遍历来重建树?

O(n log n ) 这就带来了时间和空间上的复杂性 O(n)。我们可以做得更好吗?伪代码/代码示例将不胜感激

编辑1:假设二叉树的结构由以下对象给出

public class Node
{
   int data;
   Node right;
   Node left;
// getters and setters for the left and right nodes
}
Run Code Online (Sandbox Code Playgroud)

language-agnostic algorithm tree binary-tree

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

BinaryTree (ctree, party) 的绘图忽略了 par() 的绘图选项

我想在图的上部绘制二叉树,并在第二部分(底部)制作第二个二叉树。下面是一些示例代码来显示,树的图完全忽略了由设置的分区选项par()

library("party")
### regression
airct <- ctree(Ozone ~ ., data = subset(airquality, !is.na(Ozone)))
### classification
irisct <- ctree(Species ~ .,data = iris)

par(mfrow = c(2, 1))
plot(airct)
plot(irisct)
Run Code Online (Sandbox Code Playgroud)

此代码不会在同一图(页面)中绘制两棵树。我该如何纠正?

即使遵循非常详细的答案在这种情况下也不起作用:由 'plot' 和 'ggplot' 并排生成的绘图 ctree 的绘图会忽略所有已建立的选项。

plot binary-tree r party par

5
推荐指数
1
解决办法
666
查看次数

画一棵二叉树

我正在寻找一个js库,它允许用户绘制二叉树:添加/删除叶子,添加/删除父节点等。

我发现了很多库,但其中大多数仅用于数据可视化(例如:d3),而不是从浏览器中绘制。

这真的存在吗?

谢谢!

javascript binary-tree data-structures

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

关于完全二叉树的困惑

我一直看到它被定义为

完全二叉树是一种二叉树,其中每一层(可能除了最后一层)都被完全填充,并且所有节点都尽可能地向左。

但是..我不知道“所有节点都尽可能远离”是什么意思。这就是我的问题。我无法进一步扩展它,因为我不知道“所有节点都尽可能远离”是什么意思。比如..与什么相比尽可能地靠左?我不明白

binary-tree data-structures

5
推荐指数
1
解决办法
542
查看次数

将二叉树编码为 Json

我在数据库中存储了一堆数据,以便在 html 画布中绘制二叉树


身份证号/名称

1 个苹果

2 蜜蜂

3 咖啡厅

4 钻石

8 东

9 游戏

16 爱好


这里,idx表示二叉树中项目的位置。所以上面的数据在树中看起来像这样


               1.Apple
               /     \
            2.Bee    3.Cafe
             /
      4.Diamond
       /      \
  8.East    9.Game
     /
16.Hobby
Run Code Online (Sandbox Code Playgroud)

现在,我需要将数据库行编码为 json 格式:

{
    id: "1",
    name: "Apple",
    data: {},
    children: [{
                   id: "2",
                   name: "Bee",
                   data: {},
                   children: [{
                       id: "4",
                       name: "Diamond",
                       data: {},
                       children: [{
                         // East/Game/Hobby comes here in the same manner...
                       }]
                   }]
               },
               {
                   id: "3",
                   name: "Cafe",
                   data: {},
                   children: [] …
Run Code Online (Sandbox Code Playgroud)

php json binary-tree

5
推荐指数
1
解决办法
2198
查看次数

从边列表(节点对)构建二叉树

我想从一个非常不寻常的输入构建一个二叉树。输入包含:

  1. 节点总数。

  2. 根的整数标签。

  3. 所有边(相互连接的顶点/节点)的列表。列表中的边是未排序的,只有一个规则用于确定左/右子元素 - 列表中第一个出现的边中的子元素始终位于左侧。顶点对中子/父的顺序也是随机的。

我提出了一些简单的解决方案,但它们需要对所有边的列表进行多次搜索(我基本上会找到其中有标记根的 2 条边,并对所有子树重复此过程。)

我想这种简单的方法对于具有大量节点的树来说效率非常低,但我想不出其他的办法。

有什么更有效的算法来解决这个问题的想法吗?

这是一个更好的可视化示例

输入:5 个节点,根标记为 2,边列表:[(1,0),(1,2),(2,3),(1,4)]

这棵树看起来像这样:

        2
    1       3
 0     4
Run Code Online (Sandbox Code Playgroud)

algorithm tree performance binary-tree

5
推荐指数
1
解决办法
6220
查看次数