【发布时间】:2013-09-11 10:15:01
【问题描述】:
我想向左旋转以节点 N 为根的子树(见左图),而不操纵其父节点 P。
P P P
\ | \
N | R R
/ \ |/ /
L R N N
/ /
L L
如果我愿意在一个函数中使用它,它会将N 作为参数:
void rotate_left(Node *node);
我最终会在中间图上显示一棵树。问题是尽管旋转P 仍然指向N,而不是R(左图)。如果函数rotate_left()没有指向P的指针,如何使P在旋转结束时指向R?
我想到了三种方法:
-
让
rotate_left()引用指向节点N的指针void rotate_left(Node * &node);然后调用
rotate left(),将P的右孩子传递给它(即N):rotate_left(P->right_child); 将对象
R放在N的内存地址的末尾 旋转-
将父 P 传递给
rotate_left():void rotate_left(Node *parent, Node *child);
解决方案 (2) 和 (3) 听起来不太好,在解决方案 (1) 中,您需要知道调用 rotate_left() 的函数中的父 P。
【问题讨论】:
-
您需要知道父节点才能执行此操作,除非您交换内容而不是节点。
-
您应该知道(修改)父级,因为您必须将
R设置为子级,并删除N作为P的子级。
标签: c++ pointers tree avl-tree