【问题标题】:How to rotate a subtree without knowing its parent如何在不知道其父级的情况下旋转子树
【发布时间】: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

我想到了三种方法:

  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);
    

解决方案 (2) 和 (3) 听起来不太好,在解决方案 (1) 中,您需要知道调用 rotate_left() 的函数中的父 P

【问题讨论】:

  • 您需要知道父节点才能执行此操作,除非您交换内容而不是节点。
  • 您应该知道(修改)父级,因为您必须将R 设置为子级,并删除N 作为P 的子级。

标签: c++ pointers tree avl-tree


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多