有人可以验证RedBlack Tree后继者的书写是否正确吗?

问题描述

|
pair<K,V> *RedBlackTree<K,V,Compare>::successor(K key) {

    Node *found = findNode(key,root);

    Node *p;
    Node *ch;
    Node *x;

    Node *y;
    if(found->right != sentinel)
        return new pair<K,V>(found->right->key,found->right->value);

    y = found->parent;
    /* if it does not have a left child,predecessor is its first left ancestor */
    while(y != NULL && found == y->right) {
            found = y;
            y = y->parent;
    }
    return new pair<K,V>(y->key,y->value);



}
    

解决方法

该代码不正确。考虑以下树:
   b
  / \\
 a   f
    / \\
   d   g
  / \\
 c   e
b
的有序后继是
c
。您的函数认为有序后继是
f
。要找到有序的后继者,您必须处理几种情况。该示例树具有需要处理的每种情况的实例。从每个节点开始,并写下为每个节点找到顺序后继者所需的步骤。 如果您有兴趣,可以在我对另一个问题的回答中找到带有完整说明的算法实现。 无关紧要的是,您的函数几乎肯定应该按值返回
std::pair
,并且您不应该动态分配
std::pair
。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...