In Order Successor in Binary Search Tree

前端 未结 17 1846
孤独总比滥情好
孤独总比滥情好 2020-11-27 04:11

Given a node in a BST, how does one find the next higher key?

17条回答
  •  隐瞒了意图╮
    2020-11-27 04:52

    C++ solution assuming Nodes have left, right, and parent pointers:

    This illustrates the function Node* getNextNodeInOrder(Node) which returns the next key of the binary search tree in-order.

    #include 
    #include 
    using namespace std;
    
    struct Node{
        int data;
        Node *parent;
        Node *left, *right;
    };
    
    Node *createNode(int data){
        Node *node =  new Node();
        node->data = data;
        node->left = node->right = NULL;
        return node;
    }
    
    Node* getFirstRightParent(Node *node){
        if (node->parent == NULL)
            return NULL;
    
        while (node->parent != NULL && node->parent->left != node){
            node = node->parent;
        }
        return node->parent;
    }
    Node* getLeftMostRightChild(Node *node){
        node = node->right;
        while (node->left != NULL){
            node = node->left;
        }
        return node;
    }
    Node *getNextNodeInOrder(Node *node){
        //if you pass in the last Node this will return NULL
        if (node->right != NULL)
            return getLeftMostRightChild(node);
        else
            return getFirstRightParent(node);
    }
    void inOrderPrint(Node *root)
    {
        if (root->left != NULL) inOrderPrint(root->left);
        cout << root->data << " ";
        if (root->right != NULL) inOrderPrint(root->right);
    }
    
    int main(int argc, char** argv) {
        //Purpose of this program is to demonstrate the function getNextNodeInOrder
        //of a binary tree in-order.  Below the tree is listed with the order
        //of the items in-order.  1 is the beginning, 11 is the end.  If you 
        //pass in the node 4, getNextNode returns the node for 5, the next in the 
        //sequence.
    
        //test tree:
        //
        //        4
        //      /    \
        //     2      11
        //    / \     /
        //   1  3    10
        //          /
        //         5
        //          \
        //           6 
        //            \
        //             8
        //            / \
        //           7  9
    
    
        Node *root = createNode(4);
        root->parent = NULL;
    
        root->left = createNode(2);
        root->left->parent = root;
    
        root->right = createNode(11);
        root->right->parent = root;
    
        root->left->left = createNode(1);
        root->left->left->parent = root->left;
    
        root->right->left = createNode(10);
        root->right->left->parent = root->right;
    
        root->left->right = createNode(3);
        root->left->right->parent = root->left;
    
        root->right->left->left = createNode(5);
        root->right->left->left->parent = root->right->left;
    
        root->right->left->left->right = createNode(6);
        root->right->left->left->right->parent = root->right->left->left;
    
        root->right->left->left->right->right = createNode(8);
        root->right->left->left->right->right->parent = 
                root->right->left->left->right;
    
        root->right->left->left->right->right->left = createNode(7);
        root->right->left->left->right->right->left->parent = 
                root->right->left->left->right->right;
    
        root->right->left->left->right->right->right = createNode(9);
        root->right->left->left->right->right->right->parent = 
                root->right->left->left->right->right;
    
        inOrderPrint(root);
    
        //UNIT TESTING FOLLOWS
    
        cout << endl << "unit tests: " << endl;
    
        if (getNextNodeInOrder(root)->data != 5)
            cout << "failed01" << endl;
        else
            cout << "passed01" << endl;
    
        if (getNextNodeInOrder(root->right) != NULL)
            cout << "failed02" << endl;
        else
            cout << "passed02" << endl;
    
        if (getNextNodeInOrder(root->right->left)->data != 11)
            cout << "failed03" << endl;
        else
            cout << "passed03" << endl;
    
        if (getNextNodeInOrder(root->left)->data != 3)
            cout << "failed04" << endl;
        else
            cout << "passed04" << endl;
    
        if (getNextNodeInOrder(root->left->left)->data != 2)
            cout << "failed05" << endl;
        else
            cout << "passed05" << endl;
    
        if (getNextNodeInOrder(root->left->right)->data != 4)
            cout << "failed06" << endl;
        else
            cout << "passed06" << endl;
    
        if (getNextNodeInOrder(root->right->left->left)->data != 6)
            cout << "failed07" << endl;
        else
            cout << "passed07" << endl;
    
        if (getNextNodeInOrder(root->right->left->left->right)->data != 7)
            cout << "failed08 it came up with: " << 
              getNextNodeInOrder(root->right->left->left->right)->data << endl;
        else
            cout << "passed08" << endl;
    
        if (getNextNodeInOrder(root->right->left->left->right->right)->data != 9)
            cout << "failed09 it came up with: " 
              << getNextNodeInOrder(root->right->left->left->right->right)->data 
              << endl;
        else
            cout << "passed09" << endl;
    
        return 0;
    }
    

    Which prints:

    1 2 3 4 5 6 7 8 9 10 11
    
    unit tests: 
    passed01
    passed02
    passed03
    passed04
    passed05
    passed06
    passed07
    passed08
    passed09
    

提交回复
热议问题