为什么根永远不会更改,为什么我会出现严重的访问错误

Why does the root never change and why am I getting a bad access error?

本文关键字:为什么 错误 访问 永远      更新时间:2023-10-16

我正在进行一项任务,以创建一个自排序二进制搜索树,每当重复的元素试图插入到树中时,它就会重新组织自己。我有几个错误需要帮助解决。

首先,树的根永远不会改变(我假设问题出在RotateLeft或RotateRight方法中)我有一个正在读取的示例文件,当遍历代码时,它似乎会相应地组织所有内容,但当第一个重复出现时,根永远不会变为现在优先级更高的节点。

我得到的第二个错误是BAD ACCESS error(我在下面的代码中注意到了它的位置),我猜它也来自其中一个Rotate方法。

#ifndef SelfOrganizingTree_SOBTree_h
#define SelfOrganizingTree_SOBTree_h
#include "BinaryNode.h"
#include "bst.h"

template <class T>
class BinaryNode;
template <class T>
class SOBTree: public BinarySearchTree<T> {
public:
    SOBTree();
    void insert( const T& x );
    void remove( const T& x );
    bool isEmpty() const;
    void printTree() const;
    int reportComparisonCount();
    double reportCPUTime();

private:
    void insert( const T & x, BinaryNode<T> * & t , BinaryNode<T> * & rootNode);
    void RotateRight(BinaryNode<T> * & root );
    void RotateLeft(BinaryNode<T> * & root );
    void printTree(BinaryNode<T> *t) const;
    BinaryNode<T> *root;
    void balance (BinaryNode<T> * & root);
};
template <class T >
SOBTree<T> ::  SOBTree()
{
    root = NULL; 
}
/**
 * Insert x into the tree
 */
template <class T >
void SOBTree<T > ::  insert( const T & x )
{
    insert( x, root , root);
}
/**
 * Internal method to insert into a subtree.
 * x is the item to insert.
 * t is the node that roots the subtree.
 * Set the new root of the subtree.
 */
template <class T>
void SOBTree<T> ::  insert( const T & x, BinaryNode<T> * & t , BinaryNode<T> * & rootNode)
{
   // BinaryNode<T> *current = t;
    if( t == NULL ){
        t = new BinaryNode<T>( x, NULL, NULL, rootNode );
        //cout << t->element << endl;
        t->priority++;
    }
    else if( x < t->element ){
        //cout << "left" << endl;
        insert( x, t->left , t);
    }
    else if( t->element < x ){
        //cout << "right" << endl;
        insert( x, t->right , t);
    }
    else{
        //cout << "match found" << endl;
        t->priority++;  // Duplicate; rotate right or left if priority is higher than the root
        balance(t);
    }
}
template <class T>
void SOBTree<T>::balance (BinaryNode<T> * & rootN){
    cout << "root: " << root->element << endl;
    if (rootN->parent && rootN->priority > rootN->parent->priority) { //THIS IS WHERE THE BAD ACCESS ERROR IS BEING THROWN
        if (rootN->parent->left == rootN) {
            RotateLeft(rootN->parent);
            balance(rootN->parent);
        }else if (rootN->parent->right == rootN){
            RotateRight(rootN->parent); 
            balance(rootN->parent);
        }
    }
}

template <class T>
void
SOBTree<T>::RotateLeft(BinaryNode<T> * & rootN) {
    /*
     Let P be Q's left child.
     Set P to be the new root.
     Set Q's left child to be P's right child.
     Set P's right child to be Q.
     */
    BinaryNode<T> * oldRoot = rootN;
    // perform rotation
    rootN = rootN->left;
    oldRoot->left = rootN->right;
    rootN->right= oldRoot;
}

template <class T>
void
SOBTree<T>::RotateRight(BinaryNode<T> * & rootN) {
    /*
     Let Q be P's right child.
     Set Q to be the new root.
     Set P's right child to be Q's left child.
     Set Q's left child to be P.
     */
   BinaryNode<T> * oldRoot = rootN;
    // perform rotation
    rootN = rootN->right;
    oldRoot->right = rootN->left;
    rootN->left = oldRoot;
}
template <class T>
bool SOBTree<T> ::  isEmpty( ) const
{
    return root == NULL;
}
/**
 * Print the tree contents in sorted order.
 */
template <class T>
void SOBTree<T> ::  printTree(  ) const
{
    if( isEmpty( ) )
        cout << "Empty tree" << endl;
    else
        printTree( root );
}
template <class T>
void SOBTree<T> ::  printTree( BinaryNode<T> *t ) const
{
    if( t != NULL )
    {
        printTree( t->left );
        cout << t->element << endl;
        printTree( t->right );
    }else
        return;
}

#endif

以下是BinaryNode结构的代码:

template <class Type>
class BinarySearchTree;     //forward declaration so BinaryNode knows about BinarySearchTree
template <class Type>
class BinaryNode{
public:
    Type element;
    BinaryNode<Type>* left;
    BinaryNode<Type>* right;
    BinaryNode<Type>* parent;
    int priority;
    BinaryNode( Type theElement, BinaryNode *lt, BinaryNode* rt, BinaryNode *par = NULL, int pri = 0) :
          element(theElement), left(lt), right(rt) ,  parent(par), priority(pri)
    { }
    friend  class BinarySearchTree<Type>;
};

有人看到我可以改变什么来帮助他们吗?

if (rootN->parent && rootN->priority > rootN->parent->priority) { 

rootNrootN->parentNULL或是无效指针。

相关文章: