我想知道如何保存我之前创建的二叉树.有谁知道怎么做?非常感谢.
PD:这里有一个关于如何实现二叉树的链接,我正在使用这个pice od代码:http: //code.activestate.com/recipes/286239-binary-ordered-tree/
有人可以建议我什么时候需要Level-Order Traversal(解决一些实际/现实生活场景)?
在我看来,堆超过二叉树的唯一优势是在二进制树中以O(1)而不是O(log(2)n)的复杂度找到堆中的最小项.
实现优先级队列时,您需要从数据结构中删除每个最小的项目.从树中删除最小的项,并且两个堆都以O(log(2)n)的复杂度完成.Althogh从树中删除项目可能更复杂.删除没有孩子的项目非常简单.
我的问题是为什么在实现优先级队列时使用堆而不是二叉树(在这种情况下更简单)?
我刚刚遇到这个代码来查找二叉树的大小.
public int size() {
return(size(root));
}
private int size(Node node) {
if (node == null) return(0);
else {
return(size(node.left) + 1 + size(node.right));
}
}
Run Code Online (Sandbox Code Playgroud)
我很困惑为什么它有两个方法,一个没有参数.我猜这是一个很好的做法但却无法想到原因.
我遇到了这个具有三元表达式的问题(a?b:c)并且需要将三元表达式转换为二叉树结构.
a?b:c
a
/ \
b c
a?b?c:d:e
a
/ \
b e
/ \
c d
Run Code Online (Sandbox Code Playgroud)
我使用二进制树的方法使用数组实现: -
父母居住在 - 我左边的孩子 - 2i右孩子 - 2i + 1
开始解析三元表达式,第一个字符将形成根节点,因此它将位于数组中的位置1.如果下一个字符是'?' 那么后面的人物将是它的孩子所以留下孩子(在这种情况下b将在2号位置).如果下一个字符是":",那么我们找到了正确的孩子(在第一种情况下为c),所以我们将其添加到位置3.
在第二种情况下,我们面临"?" 在b之后,无论后面是什么,它将是它的孩子,并将分别添加到2j和2j + 1,其中j是数组中b的位置.现在我们面对":"我们检查当前孩子的父母是否有两个孩子然后我们回溯并检查前一个节点,直到我们找到一个错过了正确孩子的节点.
有没有其他方法可以做到这一点?希望我已经表达得足够清楚.
我应该实现一个包含数学表达式的二叉树,为每个二进制或一元表达式使用不同的类.例如:
Expression e = new Sin(
new Pow(
new Mul(
new Plus(
new Mul(new Num(2), new Var("x")),
new Var("y")),
new Num(4)),
new Var("x")));
Run Code Online (Sandbox Code Playgroud)
树的叶子可以是变量或数字.可以使用以下方法将每个变量转换为另一个表达式:
Expression assign(String var, Expression expression)
Run Code Online (Sandbox Code Playgroud)
我有一个用于一元和二元运算符的抽象类.
我一直在努力弄清楚如何将相同的表达式分配给表达式本身的一个变量.例如:
Expression e1 = new Plus(1,"x");
e1.assign("x", e1);
System.out.println(e1.toString());
Run Code Online (Sandbox Code Playgroud)
输出应该是:
((x+1)+1)
Run Code Online (Sandbox Code Playgroud)
实际发生的是表达式的左侧部分指向自身,导致无限循环.有没有办法复制对象但使用不同的指针来避免它?或者可能采用不同的方式来实现方法"assign"的工作方式?
这是我的实现:
二进制表达式类:
import java.util.List;
import java.util.Map;
abstract public class BinaryExpression extends BaseExpression implements Expression {
protected Expression first, second;
public BinaryExpression(Expression first, Expression second) {
this.setSecond(second);
this.setFirst(first);
}
public BinaryExpression(double number1, double number2) {
this(new Num(number1), new Num(number2)); …Run Code Online (Sandbox Code Playgroud) 请帮助识别此 B 堆中的模式:
在正常的二叉堆中,我们总是使用以下条件:left_child = 2*i, right_child = 2*i+1 parent = i/2
但是这些条件只适用于前 2 个级别,我无法识别剩余的模式。请帮我。
我有一个数组 var array = [8,10,12,5,3,6];
逻辑
=<父节点,它将是父节点的左节点>父节点,则为父节点的右节点我正在尝试实现如下对象的输出:
{
value:8,
left:{
value:5,
left:{ value:3 },
right:{value:6}
},
right:{
value:10,
right:{value:12}
}
}
Run Code Online (Sandbox Code Playgroud)
这将是这样的图像
我试过下面的代码:
var arr = [8,10,12,5,3,6];
var root = arr[0];
var rv = {};
for (var i = 0; i < arr.length; i++){
if(arr[i] < root){
rv.left = arr[i];
}else{
rv.right = arr[i];
}
}
console.log(rv);
Run Code Online (Sandbox Code Playgroud)
请帮我解决这个问题。
我得到了严格二叉树的后序遍历,并被要求找到它的前序遍历。通常,我会先构建树,然后找到前序遍历。但是,我想知道是否有任何方法可以在不实际构建树的情况下找到预序遍历。
二叉树的顶视图究竟是什么?
我从我找到的文章中发现了很大的歧义和缺乏清晰度。
例如,这是用于演示geeksforgeeks上的顶视图的内容:
1
/ \
2 3
/ \ / \
4 5 6 7
Run Code Online (Sandbox Code Playgroud)
他们继续说顶视图是 4 2 1 3 7。这里的问题是他们对不是顶视图的东西留下了很多猜测。因此,在代码中实现变得模棱两可。
到目前为止,Stackoverflow示例也好不到哪里去。Hackerrank的例子更糟。
所以我希望有人能明确地告诉我顶视图是什么,因为我一直试图找出 2 天。例如,这棵树的顶视图是什么:
1
\
14
/ \
3 15
/ \
2 7
/ \
4 13
/ \ /
5 6 10
/ \
8 11
\ \
9 12
Run Code Online (Sandbox Code Playgroud)
如果我可以大胆地问,为什么这很重要?
binary-tree ×10
java ×3
arrays ×1
binary-heap ×1
c ×1
collections ×1
heap ×1
javascript ×1
math ×1
oop ×1
persistence ×1
postorder ×1
preorder ×1
python ×1
queue ×1
recursion ×1
tree ×1