- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为伸展树(Splay Tree)编写 C++ 模板结构,但是当我尝试测试代码时,我得到了非常奇怪的结果。
这是我的模板代码:
template <class T>
struct splaytree {
struct node {
splaytree<T> *tree;
node *p, *c[2];
T v;
int w;
node(T t, splaytree<T> *st) {
v = t;
p = 0;
c[0] = 0;
c[1] = 0;
w = 1;
tree = st;
}
int side() {
return (p->c[1] == this) ? 1:0;
}
void r() {
node *x = this;
int b = x->side();
node *p = x->p;
x->w = p->w;
p->w = x->c[1^b]->w + 1 + p->c[1^b]->w;
x->p = p->p;
p->p = x;
p->c[0^b] = x->c[1^b];
x->c[1^b] = p;
}
void splay() {
node *x = this;
while (x->p) {
node *p = x->p;
if (p == tree->root) x->r();
else if (((x->side())^(p->side()))) {
x->r();
x->r();
}
else {
p->r();
x->r();
}
}
tree->root = this;
}
int index() {
this->splay();
return this->c[0]->w;
}
};
node *root;
splaytree() {
root = 0;
}
void add(T k) {
node x0(k,this);
node *x = &x0;
if (root == 0) {
root = x;
return;
}
node *i = root;
while (i != x) {
int b = (k < i->v) ? 0:1;
if (i->c[b] == 0) {
i->c[b] = x;
i->w++;
x->p = i;
}
i = i->c[b];
}
x->splay();
}
};
我正在用它来测试它:
int main() {
splaytree<int> st;
st.add(2);
cout << st.root->v << endl;
cout << st.root->v << endl;
st.add(3);
cout << st.root->c[0] << endl;
}
我插入了元素2,然后打印了两次根节点的值。不知何故,这两张照片给了我两个不同的值(Ideone 中的 2 和 10 http://ideone.com/RxZMyA)。当我在我的计算机上运行该程序时,它给了我 2 和 1875691072。在这两种情况下,当在 2 之后插入一个 3 时,根节点的左子节点是一个空指针,而它应该是一个包含 2 的节点对象。
有人能告诉我为什么在两次打印同一内容时会得到两个不同的值,以及我可以做些什么来使我的 splaytree.add() 函数按预期工作吗?谢谢!
最佳答案
之后
node x0(k,this);
node *x = &x0;
if (root == 0) {
root = x;
return;
}
root
是局部变量的地址。当您打印 root->v
时,x0
已超出范围。所有关于 root
真正指向什么的赌注都落空了。
关于c++ - 我的 splay 树实现中的奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39733475/
平衡树 \(\tt{Treap}\) & \(\tt{Splay}\) 壹.单旋 \(\tt{Treap}\) 首先了解 \(\tt{BST}\) 非常好用的东西,但是数据可以把它卡成一
我是数据结构的初学者。我正在尝试为带有 splay 树的范围函数编写一些伪代码:Range(S, A, B),它将 S 更改为其键值 C 满足 A ≤ 的所有成员的集合C ≤ B。我知道伸展树(Spl
由于 splay tree 是一种不平衡二叉搜索树 ( brilliant.org/wiki/splay-tree ),它不能保证最大为 O(log(n)) 的高度。因此,我认为它不能保证 O(log
我有 2 个关于八角树的问题: 1。删除节点 我正在使用的书是这样说的:''当删除键 k 时,我们展开被删除的节点 w 的父节点。删除 8 的示例: 但是,我正在做的是:如果删除的节点不是根节点,我展
我正在研究伸展树(Splay Tree)的右旋转方法。当我尝试运行程序时,我不断收到空指针异常,但我不确定为什么。这是我的树 5 / 2 / 1 这是我得到空指
我正在尝试为伸展树(Splay Tree)编写 C++ 模板结构,但是当我尝试测试代码时,我得到了非常奇怪的结果。 这是我的模板代码: template struct splaytree {
我试图了解摊销的复杂性并在网上进行了几次搜索,但我还找不到好的资源。 那么谁能解释一下什么是摊销复杂度以及它如何在 splay 树中每个操作变为 O(lg n)? 最佳答案 对伸展树(Splay Tr
我不明白展开是如何工作的。 我无法理解的部分是我们如何知道 a: i) zig ii) zig-zag 或 iii) zig-zig 必须完成。 如果我理解正确的话,这与路径中的当前节点有关。 如果它
您会在生产环境中的哪些地方使用 splay-tree。我指的是真实生活的例子。 我正在考虑使用尝试和拉伸(stretch)树实现自动完成。对于大型数据集,从节点 x 到叶子遍历 trie 以返回结果并
我正在尝试自下而上地实现递归伸展树(Splay Tree)。我向下递归到需要展开的节点,然后找到该节点的父节点和祖父节点。然后,我可以根据情况进行之字形或之字形。问题是完成后,我将已经张开一次的节点返
我已经实现了几个 splay tree算法。 比较它们的最佳方式是什么? 添加随机节点时比较执行时间是否是一个好的开始? 我还实现了一个二叉搜索树,用于跟踪每个节点的访问量。我编写了一个 optimi
我一直在研究 Splay 树,因为我想实现一个。目前,我对红黑树、AVL 树、跳表和其他更简单的数据结构有一些“自学”经验。我想实现我的第一个 splay 树,但如果可能的话,我想要一个递归实现(我喜
展开树插入/删除可以用不同的方式完成。一种流行的方法是插入 key 并将其展开到根。但是我读过还有一种不同的方法,这个想法是 拆分 它分成两棵树,左边的树有值插入键。备用删除方法也是如此,将要删除的键
由于 splay 树用于缓存,我想知道当我想有效缓存时,Splay Tree 比 HashTable 有什么优势? 我什么时候应该更喜欢 splay 树而不是哈希表? 我想这是一个比 BST 更专业的
例如,我有一个这样的文件夹结构: src └─test ├─java └─com └─google └─test
问题是,当我单击树列表父元素时,它不会像在树面板中的 DoubleClick 上展开那样展开。任何人都可以帮助我找到我应该做什么来实现这一目标?在这张图片中,当我单击父节点时,它不会像我们看到的那样展
我知道如何捕获节点上的点击: // Define action when a node was clicked. $('#mytree').on("select_node.jstree
我正在寻找有人解释 Puppet 配置中 splay 和 splaylimit 的用法。 Puppet 站点本身的文档至少可以说是有限的。我正遭受主控上的惊群攻击,即多个代理同时向该代理敲击其目录,直
我必须使用java实现伸展树(Splay Tree)结构。给定一个名为 Node 的类,它具有: 左、右 child 信息(整数) 节点的高度 我的作业包括创建“插入”方法。 我已经尝试了一些策略,但
我一直在尝试学习一些数据结构的细节,并且我正在尝试让二叉伸展树(Splay Tree)正常工作。每次我运行以下代码并且我正在寻找的节点超过根的节点时,它都会告诉我它在那里,然后只删除从根向下的整个一侧
我是一名优秀的程序员,十分优秀!