指针交换怪异
pointer swap weirdness
我有以下工作代码,用于红黑树旋转。
void BalancedTree::rotateLeft(Node* & x){
37 Node* y = x->right;
38
39 x->right = y->left;//slice y's left child
40 x->right->parent = x;
41
42 y->left = x;//switch x and y's parentship
43 Node* xp = x->parent;//for some reason, y->parent = x->parent causes logic
errors.
44 x->parent = y;
45 y->parent = xp;
46
47 if (y->parent == nil) root = y;//fix grandparent
48 else if (y->parent->parent->left == x) y->parent->parent->left = y;
49 else y->parent->parent->right = y;
50 }
当第 43 行和第 45 行被替换为 (保留 44( 时
y->parent = x->parent
或者,只是交换第 44 行和第 45 行,将 Node 指针的内容更改了 x。我想做的是:更改 Node 中的指针(父级((由 y 指向(,并让它指向 x 的父级。
节点结构为:
struct Node{
Node* parent;
Node* left;
Node* right;
int value;
};
我错过了什么吗?指针的基本属性?
编辑:第313页Cormen的算法介绍
LEFT-ROTATE(T, x)
1 y = x.right
2 x.right = y.left
3 if y.left != T.nil
4 y.left.p = x
5 y.p = x.p
6 if x.p == T.nil
7 T.root = y
8 elseif x == x.p.left
9 x.p.left = y
10 else x.p.right = y
11 y.left = x
12 x.p = y
编辑2:这是代码不起作用:
36 void BalancedTree::rotateLeft(Node* & x){
37 Node* y = x->right;
38
39 x->right = y->left;//slice y's left child
40 x->right->parent = x;
41
42 y->left = x;//switch x and y's parentship
43 y->parent = x->parent;
44 x->parent = y;
45
46
47 if (y->parent == nil) root = y;//fix grandparent
48 else if (y->parent->parent->left == x) y->parent->parent->left = y;
49 else y->parent->parent->right = y;
50 }
您提供的两个版本的代码确实是等效的。但是,此算法的实现与Cormen参考中编写的算法关系不大。您的代码应为:
void BalancedTree::rotateLeft(Node* & x){
Node* y = x->right;
x->right = y->left;
if (y->left != nil)
y->left->parent = x;
y->parent = x->parent;
if (x->parent == nil)
root = y;
else if (x == x->parent->left)
x->parent->left = y;
else
x->parent->right = y;
y->left = x;
x->parent = y;
}
相关文章:
- 共享指针的复制和交换效率
- 如何在单个链表中交换两个节点的位置,只修改指针
- 以原子方式交换指针与 nullptr
- 使用指针交换整数
- 使用指针 c++ 交换结构数组中的元素
- 使用指针交换数组的内容
- 无法使用指针写入交换
- 使用指针交换而不引用数组C++
- 交换指针值
- 了解std ::交换指针和std :: vectors
- 互锁交换与互锁交换指针
- 通过交换指针对字符数组进行排序,C++
- 交换指针,删除第二个对象并创建指向第二个的新指针
- 为什么在C++中,交换指针在向量中不起作用
- 使用一个函数在两个不同的类中交换指针
- 在c++中交换指针
- 用于交换指针的c++函数在作用域中工作
- C++交换指针
- 尝试在经过几层抽象之后交换指针向量中的指针
- 交换指针