一些二叉树结构(例如堆)可以通过设置从左到右、从上到下的索引来使用数组来实现
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(???)
首先,我想声明这不是家庭作业。我正在准备面试并遇到这个问题。我想我们可以通过中序和级序遍历的定义。:-)。
例如:
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。
以上面的树为例。
Run Code Online (Sandbox Code Playgroud)(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 …
我试图找到一种方法,我可以采用二叉树类并遍历其节点,在每个节点上
执行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 的系列操作的类对象作为参数,而是一组完全不同的参数。
这怎么可能?执行此操作的最动态方式是什么?
当我在学习关于二叉树的期中考试时,我发现了一个陈述,即任何任意的 n 节点二叉树都可以转换为最多 2*n-2 次旋转的任何其他 n 节点二叉树。有什么证据吗?我用渐近符号找到了某种证明,但不是那么清楚。我的意思是有人可以解释/说明为什么这是真的吗?如果它说 n 节点二叉树,它是否包括根?
我试图想出一种从二叉树/二叉搜索树中删除重复项的算法。到目前为止我能想到的最好的是
将树的中序遍历存储在数组中。
如果树没有排序,则对数组进行排序。
从数组中删除重复项并重建二叉树。
我们是否还需要存储树的前序遍历来重建树?
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) 我想在图的上部绘制二叉树,并在第二部分(底部)制作第二个二叉树。下面是一些示例代码来显示,树的图完全忽略了由设置的分区选项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 的绘图会忽略所有已建立的选项。
我正在寻找一个js库,它允许用户绘制二叉树:添加/删除叶子,添加/删除父节点等。
我发现了很多库,但其中大多数仅用于数据可视化(例如:d3),而不是从浏览器中绘制。
这真的存在吗?
谢谢!
我一直看到它被定义为
完全二叉树是一种二叉树,其中每一层(可能除了最后一层)都被完全填充,并且所有节点都尽可能地向左。
但是..我不知道“所有节点都尽可能远离”是什么意思。这就是我的问题。我无法进一步扩展它,因为我不知道“所有节点都尽可能远离”是什么意思。比如..与什么相比尽可能地靠左?我不明白
我在数据库中存储了一堆数据,以便在 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) 我想从一个非常不寻常的输入构建一个二叉树。输入包含:
节点总数。
根的整数标签。
所有边(相互连接的顶点/节点)的列表。列表中的边是未排序的,只有一个规则用于确定左/右子元素 - 列表中第一个出现的边中的子元素始终位于左侧。顶点对中子/父的顺序也是随机的。
我提出了一些简单的解决方案,但它们需要对所有边的列表进行多次搜索(我基本上会找到其中有标记根的 2 条边,并对所有子树重复此过程。)
我想这种简单的方法对于具有大量节点的树来说效率非常低,但我想不出其他的办法。
有什么更有效的算法来解决这个问题的想法吗?
这是一个更好的可视化示例:
输入:5 个节点,根标记为 2,边列表:[(1,0),(1,2),(2,3),(1,4)]
这棵树看起来像这样:
2
1 3
0 4
Run Code Online (Sandbox Code Playgroud)