如何在不知道其父节点的情况下旋转子树

时间:2013-09-11 10:15:01

标签: c++ pointers tree avl-tree

我想在不操纵其父N的情况下向左旋转以节点P为根的子树(参见左图)。

P             P              P   
 \            |               \
  N           | R              R
 / \          |/              /
L   R         N              N
             /              /
            L              L

如果我要在一个函数中使用N作为参数:

void rotate_left(Node *node);

我最终将会看到中间人物上的一棵树。问题在于,尽管轮换P仍指向N,但仍未指向R(左图)。如果函数P没有指向R的指针,如何在轮换结束时rotate_left()指向P

我想到了三种方法:

  1. rotate_left()引用指向节点N

    的指针
    void rotate_left(Node * &node);
    

    然后拨打rotate left(),传递给P的正确孩子(即。{ N):

    rotate_left(P->right_child);
    
  2. 将对象R放在N的内存地址的末尾 旋转

  3. 将父P传递给rotate_left()

    void rotate_left(Node *parent, Node *child);
    
  4. 解决方案(2)和(3)听起来不错,在解决方案(1)中,您需要知道调用P的函数中的父rotate_left()

1 个答案:

答案 0 :(得分:1)

解决方案1是您建议的三个中最好的。它或多或少等同于解决方案3.我会使用它。在我看来,无论你在哪里调用rotate_left,你都已经知道存储这个指针的变量(父节点或root),所以传递它的引用不会有问题

解决方案2(交换内容)将使树外已存在的任何指针无效。你必须非常小心;如果有这样的指示,不要使用它。但是,这是您问题的唯一真实答案"如何在不知道父母的情况下轮换?"。

我想你不想保留指向树中父节点的指针。如果您准备这样做,一切都会更容易。