संतुलन स्ट्रिंग आधारित द्विआधारी खोज वृक्ष (वर्तनी जाँचने के लिए)

वोट
1

अद्यतन: मैं नहीं मिल सकता है संतुलन काम करने के लिए, क्योंकि मैं doAVLBalance नहीं मिल सकता सदस्य कार्यों isBalanced (), isRightHeavy (), isLeftHeavy पहचान करने के लिए। और मैं पता नहीं क्यों! मैं सैश के उदाहरण (3 जवाब) की कोशिश की, लेकिन मैं वास्तव में मिलता है मंदी असंगत है और मुझे लगता है कि ठीक नहीं कर सकता है ... इसलिए मैं यह मेरा तरीका कर की कोशिश की ... और यह मुझसे कहता है उन सदस्य कार्यों मौजूद नहीं है, जब वे स्पष्ट रूप से करते हैं।

त्रुटि: वर्ग IntBinaryTree:।। TreeNode isRightHeavy मैं पिछले 4 घंटे :( के लिए कोशिश कर के बाद अटक कर रहा हूँ कोई भी सदस्य है नीचे अपडेट किया गया कोड, मदद की बहुत सराहना की जाएगी !!

मैं एक बना रहा हूं आधारित द्विआधारी खोज वृक्ष स्ट्रिंग और यह एक संतुलित पेड़ बनाने की जरूरत है। मैं यह कैसे करु? * मदद कृपया !! अग्रिम में धन्यवाद!

BinarySearchTree.cpp:

    bool IntBinaryTree::leftRotation(TreeNode *root)
    {
        //TreeNode *nodePtr = root;  // Can use nodePtr instead of root, better?
        // root, nodePtr, this->?

        if(NULL == root)
        {return NULL;}

        TreeNode *rightOfTheRoot = root->right;
        root->right = rightOfTheRoot->left;
        rightOfTheRoot->left = root;

        return rightOfTheRoot;
    }

    bool IntBinaryTree::rightRotation(TreeNode *root)
    {
        if(NULL == root)
        {return NULL;}
        TreeNode *leftOfTheRoot = root->left;
        root->left = leftOfTheRoot->right;
        leftOfTheRoot->right = root;

        return leftOfTheRoot;
    }

    bool IntBinaryTree::doAVLBalance(TreeNode *root)
    {


        if(NULL==root)
            {return NULL;}
        else if(root->isBalanced()) // Don't have isBalanced
            {return root;}

        root->left = doAVLBalance(root->left);
        root->right = doAVLBalance(root->right);

        getDepth(root); //Don't have this function yet

        if(root->isRightHeavy()) // Don't have isRightHeavey
        {
            if(root->right->isLeftheavey())
            {
                root->right = rightRotation(root->right);
            }
            root = leftRotation(root);
        }
        else if(root->isLeftheavey()) // Don't have isLeftHeavey
        {
            if(root->left->isRightHeavey())
            {
                root->left = leftRotation(root->left);
            }
            root = rightRotation(root);
        }
        return root;
    }

    void IntBinaryTree::insert(TreeNode *&nodePtr, TreeNode *&newNode)
    {
        if(nodePtr == NULL)
            nodePtr = newNode;                  //Insert node
        else if(newNode->value < nodePtr->value)
            insert(nodePtr->left, newNode);     //Search left branch
        else
            insert(nodePtr->right, newNode);    //search right branch
    }

//
// Displays the number of nodes in the Tree


int IntBinaryTree::numberNodes(TreeNode *root)
{
    TreeNode *nodePtr = root;

    if(root == NULL)
        return 0;

    int count = 1; // our actual node
    if(nodePtr->left !=NULL)
    { count += numberNodes(nodePtr->left);
    }
    if(nodePtr->right != NULL)
    {
        count += numberNodes(nodePtr->right);
    }
    return count;
} 

    // Insert member function

    void IntBinaryTree::insertNode(string num)
    {
        TreeNode *newNode; // Poitner to a new node.

        // Create a new node and store num in it.
        newNode = new TreeNode;
        newNode->value = num;
        newNode->left = newNode->right = NULL;

        //Insert the node.
        insert(root, newNode);
    }

    // More member functions, etc.

BinarySearchTree.h:

class IntBinaryTree
{
private:
    struct TreeNode
    {
        string value; // Value in the node
        TreeNode *left; // Pointer to left child node
        TreeNode *right; // Pointer to right child node
    };

    //Private Members Functions
    // Removed for shortness
    void displayInOrder(TreeNode *) const;


public:
    TreeNode *root;
    //Constructor
    IntBinaryTree()
        { root = NULL; }
    //Destructor
    ~IntBinaryTree()
        { destroySubTree(root); }

    // Binary tree Operations
    void insertNode(string);
    // Removed for shortness

    int numberNodes(TreeNode *root);
    //int balancedTree(string, int, int); // TreeBalanced

    bool leftRotation(TreeNode *root);
    bool rightRotation(TreeNode *root);
    bool doAVLBalance(TreeNode *root); // void doAVLBalance();
    bool isAVLBalanced();

    int calculateAndGetAVLBalanceFactor(TreeNode *root);

    int getAVLBalanceFactor()
    {
        TreeNode *nodePtr = root; // Okay to do this? instead of just
        // left->mDepth
        // right->mDepth

        int leftTreeDepth = (left !=NULL) ? nodePtr->left->Depth : -1;
        int rightTreeDepth = (right != NULL) ? nodePtr->right->Depth : -1;
        return(leftTreeDepth - rightTreeDepth);
    }

    bool isRightheavey() { return (getAVLBalanceFactor() <= -2); }

    bool isLeftheavey() { return (getAVLBalanceFactor() >= 2); }


    bool isBalanced()
    {
        int balanceFactor = getAVLBalanceFactor();
        return (balanceFactor >= -1 && balanceFactor <= 1);
    }


    int getDepth(TreeNode *root); // getDepth

    void displayInOrder() const
        { displayInOrder(root); }
    // Removed for shortness
};
02/08/2011 को 05:00
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


3 जवाब

वोट
1

ऐसा करने के कई तरीके हैं, लेकिन मैं सुझाव देंगे कि आप वास्तव में सभी के रूप में ऐसा नहीं। आप तार का एक BST स्टोर करने के लिए चाहते हैं, तो ज्यादा बेहतर विकल्प हैं:

  1. एक prewritten द्विआधारी खोज वृक्ष वर्ग का प्रयोग करें। सी ++ std :: सेट वर्ग एक संतुलित द्विआधारी खोज वृक्ष के रूप में एक ही समय की गारंटी देता है प्रदान करता है और अक्सर इस तरह के रूप में कार्यान्वित किया जाता है। यह काफी हद तक आप खुद BST रोलिंग से उपयोग करने के लिए आसान है।

  2. बजाय एक Trie का प्रयोग करें। trie डेटा संरचना को सरल और तार का एक BST तुलना में अधिक कुशल है, सभी में कोई संतुलन की आवश्यकता है, और एक BST से तेज है।

क्या तुम सच में अपने स्वयं के संतुलित BST लिखना चाहिए, तो आप कई विकल्प हैं। अधिकांश BST कार्यान्वयन कि संतुलन का उपयोग अत्यंत जटिल होते हैं और दिल वालों के लिए नहीं हैं। मैं या तो एक treap या एक टेढ़ा पेड़ है, जो दो संतुलित BST संरचनाओं कि बल्कि लागू करने के लिए सरल कर रहे हैं को लागू करने का सुझाव चाहते हैं। वे कोड आप ऊपर की तुलना में दोनों अधिक जटिल हैं और मैं इस छोटे से अंतरिक्ष में एक कार्यान्वयन नहीं प्रदान कर सकते हैं, लेकिन इन संरचनाओं के लिए एक विकिपीडिया खोज आप आगे बढ़ने के बारे में सलाह के बहुत सारे देना चाहिए।

उम्मीद है की यह मदद करेगा!

02/08/2011 को 06:21
का स्रोत उपयोगकर्ता

वोट
1

दुर्भाग्य से, हम प्रोग्रामर शाब्दिक जानवरों रहे हैं।

यह एक "संतुलित" पेड़ हैं।

"संतुलित" संदर्भ निर्भर है। परिचयात्मक डेटा संरचनाओं कक्षाएं आम तौर पर किया जा रहा है "संतुलित" जब सबसे बड़ी गहराई के नोड और कम से कम गहराई के नोड के बीच का अंतर कम से कम है एक पेड़ को देखें। लेकिन, जैसा कि सर Templatetypedef से उल्लेख किया है, एक टेढ़ा पेड़ एक संतुलन पेड़ माना जाता है। इसका कारण यह है कि यह मामलों में नहीं बल्कि अच्छी तरह से पेड़ संतुलन कर सकते हैं कि कुछ नोड्स अक्सर एक समय में एक साथ पहुँचा है। इसका कारण यह है कि यह एक पारंपरिक द्विआधारी पेड़ की तुलना में एक टेढ़ा पेड़ में डेटा पर प्राप्त करने के लिए कम नोड traversals लेता है इन मामलों में । दूसरी ओर, एक पहुँच-दर-पहुँच आधार पर बुरी से बुरी हालत प्रदर्शन एक लिंक्ड सूची के रूप में के रूप में बुरा हो सकता है।

जुड़ा हुआ सूचियों की बात हो रही ...

क्योंकि अन्यथा बिना "संतुलन" यह एक लिंक्ड सूची मैंने पढ़ा है की तरह ही है और उद्देश्य को हरा दिया।

यह कर सकते हैं के रूप में बुरा हो, लेकिन बेतरतीब आवेषण के लिए ऐसा नहीं है। आप पहले से ही-छाँटे गए डेटा को सम्मिलित करते हैं, तो सबसे द्विआधारी खोज वृक्ष कार्यान्वयन एक फूला हुआ जैसे डेटा स्टोर होगा और सूची जुड़ा हुआ आदेश दिया। हालांकि, कि सिर्फ इसलिए कि तुम पेड़ के एक तरफ लगातार बना रहे है। (एक द्विआधारी पेड़ में 1, 2, 3, 4, 5, 6, 7, आदि ... डालने की कल्पना करें। कागज पर यह कोशिश करो और देखो क्या होता है।)

आप एक सैद्धांतिक बुरी से बुरी हालत-चाहिए-गारंटी अर्थ में संतुलन के लिए है, तो मैं लाल-काले पेड़ सलाह देते हैं। (गूगल यह, दूसरी कड़ी काफ़ी अच्छी है।)

कि जिस तरह से संतुलन किसी भी अतिरिक्त कोड के बिना संभवतया क्या होगा - आप इस विशेष परिदृश्य के लिए एक उचित तरीके से संतुलन के लिए है, तो मैं पूर्णांक सूचकांक और एक सभ्य हैश फंक्शन के साथ जाना चाहते हैं। यही कारण है, का कहना है कि अपनी तुलना समारोह हैश की तरह लग रहे बनाने के लिए है (Stra) <बजाय अब तुम क्या मिल गया है के हैश (STRB)। (इस मामले के लिए एक त्वरित लेकिन प्रभावी हैश के लिए, Google पर पहला हिट FNV हैशिंग देखो।। नीचे जाएं जब तक आप उपयोगी कोड देखें।) आप कार्यान्वयन क्षमता के विवरण के बारे में आप चाहते हैं, तो चिंता कर सकते हैं। (उदाहरण के लिए, आप दोनों हर एक बार जब आप तार कभी नहीं बदलता में से एक के बाद से तुलना हैश प्रदर्शन करने के लिए नहीं है।)

आप इसके साथ दूर मिल सकता है, मैं दृढ़ता से बाद की सलाह देते हैं अगर आप समय के लिए एक संकट में हैं और कुछ तेजी से करना चाहते हैं। अन्यथा, लाल-काले पेड़ों सार्थक बाद से वे व्यवहार में अत्यंत उपयोगी होते हैं, जब आप अपने खुद के ऊंचाई से संतुलित द्विआधारी पेड़ रोल करने की जरूरत है।

अंत में, इसके बाद के संस्करण के लिए अपने कोड को संबोधित नीचे दिए गए कोड में टिप्पणियां देखें:

int IntBinaryTree::numberNodes(TreeNode *root)
{
    if(root = NULL) // You're using '=' where you want '==' -- common mistake.
                    // Consider getting used to putting the value first -- that is,
                    // "NULL == root". That way if you make that mistake again, the
                    // compiler will error in many cases.
        return 0;
    /*
    if(TreeNode.left=null && TreeNode.right==null)  // Meant to use '==' again.
    { return 1; }

    return numberNodes(node.left) + numberNodes(node.right);
    */

    int count = 1; // our actual node
    if (left != NULL)
    {
        // You likely meant 'root.left' on the next line, not 'TreeNode.left'.
        count += numberNodes(TreeNode.left);
        // That's probably the line that's giving you the error.
    }
    if (right != NULL)
    {
        count += numberNodes(root.right);
    }
    return count;
}
02/08/2011 को 08:10
का स्रोत उपयोगकर्ता

वोट
1

प्रोग्रामर्स AVL ट्री अवधारणाओं का प्रयोग द्विआधारी पेड़ के संतुलन के लिए। यह काफी सरल है। अधिक जानकारी ऑनलाइन पाया जा सकता। त्वरित विकी लिंक

नीचे नमूना कोड जो AVL कलन विधि का उपयोग पेड़ संतुलन करता है।

Node *BinarySearchTree::leftRotation(Node *root)
{
    if(NULL == root)
    {
        return NULL;
    }
    Node *rightOfTheRoot = root->mRight;
    root->mRight = rightOfTheRoot->mLeft;
    rightOfTheRoot->mLeft = root;

    return rightOfTheRoot;
}

Node *BinarySearchTree::rightRotation(Node *root)
{
    if(NULL == root)
    {
        return NULL;
    }
    Node *leftOfTheRoot = root->mLeft;
    root->mLeft = leftOfTheRoot->mRight;
    leftOfTheRoot->mRight = root;

    return leftOfTheRoot;
}

Node *BinarySearchTree::doAVLBalance(Node *root)
{
    if(NULL == root)
    {
        return NULL;
    }
    else if(root->isBalanced())
    {
        return root;
    }

    root->mLeft  = doAVLBalance(root->mLeft);
    root->mRight = doAVLBalance(root->mRight);

    getDepth(root);

    if(root->isRightHeavy())
    {
        if(root->mRight->isLeftHeavy())
        {
            root->mRight = rightRotation(root->mRight);
        }
        root = leftRotation(root);
    }
    else if(root->isLeftHeavy())
    {
        if(root->mLeft->isRightHeavy())
        {
            root->mLeft = leftRotation(root->mLeft);
        }
        root = rightRotation(root);
    }

    return root;
}

कक्षा परिभाषा

class BinarySearchTree
{
public:
    // .. lots of methods 
    Node *getRoot();
    int getDepth(Node *root);

    bool isAVLBalanced();
    int calculateAndGetAVLBalanceFactor(Node *root);
    void doAVLBalance();

private:
     Node *mRoot;
};

class Node
{
public:
    int  mData;
    Node *mLeft;
    Node *mRight;
    bool mHasVisited;
    int mDepth;
public:

    Node(int data)
    : mData(data),
      mLeft(NULL),
      mRight(NULL),
      mHasVisited(false),
      mDepth(0)
    {
    }

    int getData()              { return mData; }

    void setData(int data)     { mData = data;  }

    void setRight(Node *right) { mRight = right;}

    void setLeft(Node *left)   { mLeft = left; }

    Node * getRight()          { return mRight; }

    Node * getLeft()           { return mLeft; }

    bool hasLeft()             { return (mLeft != NULL);  }

    bool hasRight()            { return (mRight != NULL); }

    bool isVisited()           { return (mHasVisited == true); }

    int getAVLBalanceFactor()
    {
        int leftTreeDepth = (mLeft != NULL) ? mLeft->mDepth : -1;
        int rightTreeDepth = (mRight != NULL) ? mRight->mDepth : -1;
        return(leftTreeDepth - rightTreeDepth);
    }

    bool isRightHeavy() { return (getAVLBalanceFactor() <= -2); }

    bool isLeftHeavy()  { return (getAVLBalanceFactor() >= 2);  }

    bool isBalanced()
    {
        int balanceFactor = getAVLBalanceFactor();
        return (balanceFactor >= -1 && balanceFactor <= 1);
    }
};
02/08/2011 को 17:45
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more