📜  BST中给定密钥的有序前任和后继|迭代法

📅  最后修改于: 2021-05-24 21:26:06             🧑  作者: Mango

给定一个BST和一个密钥。任务是找到给定密钥的有序后继者和前任者。如果不存在前任者或后任者,则打印-1。
例子:

Input:          50
               /  \
              /    \
            30     70
           / \     / \
          /   \   /   \
         20   40 60   80
            key = 65
Output: Predecessor : 60
        Successor : 70

Input:          50
               /  \
              /    \
            30     70
           / \     / \
          /   \   /   \
         20   40 60   80
            key = 100
Output: predecessor : 80
        successor : -1
Explanation: As no node in BST has key value greater 
than 100 so -1 is printed for successor.

在上一篇文章中,已经讨论了递归解决方案。可以使用迭代方法解决该问题。为了解决该问题,在搜索密钥时必须处理以下三种情况:

  1. 根是给定的键:在这种情况下,如果左子树不为NULL,则前任者是左子树中的最右节点,如果右子树不为NULL,则后继者是右子树中的最左节点。
  2. 根大于密钥:在这种情况下,密钥存在于根的左子树中。因此,通过设置root = root-> left在左子树中搜索关键字。请注意,root可以是给定密钥的有序继承者。如果键没有正确的子树,则根将为其后继。
  3. 根小于键:在这种情况下,键出现在根的右子树中。因此,通过设置root = root-> right,在right子树中搜索关键字。请注意,root可能是给定密钥的有序前身。如果键没有左子树,则根将为其前任。

下面是上述方法的实现:

C++
// C++ program to find predecessor
// and successor in a BST
#include 
using namespace std;
 
// BST Node
struct Node {
    int key;
    struct Node *left, *right;
};
 
// Function that finds predecessor and successor of key in BST.
void findPreSuc(Node* root, Node*& pre, Node*& suc, int key)
{
    if (root == NULL)
        return;
 
    // Search for given key in BST.
    while (root != NULL) {
 
        // If root is given key.
        if (root->key == key) {
 
            // the minimum value in right subtree
            // is predecessor.
            if (root->right) {
                suc = root->right;
                while (suc->left)
                    suc = suc->left;
            }
 
            // the maximum value in left subtree
            // is successor.
            if (root->left) {
                pre = root->left;
                while (pre->right)
                    pre = pre->right;
            }
 
            return;
        }
 
        // If key is greater than root, then
        // key lies in right subtree. Root
        // could be predecessor if left
        // subtree of key is null.
        else if (root->key < key) {
            pre = root;
            root = root->right;
        }
 
        // If key is smaller than root, then
        // key lies in left subtree. Root
        // could be successor if right
        // subtree of key is null.
        else {
            suc = root;
            root = root->left;
        }
    }
}
 
// A utility function to create a new BST node
Node* newNode(int item)
{
    Node* temp = new Node;
    temp->key = item;
    temp->left = temp->right = NULL;
    return temp;
}
 
// A utility function to insert
// a new node with given key in BST
Node* insert(Node* node, int key)
{
    if (node == NULL)
        return newNode(key);
    if (key < node->key)
        node->left = insert(node->left, key);
    else
        node->right = insert(node->right, key);
    return node;
}
 
// Driver program to test above function
int main()
{
    int key = 65; // Key to be searched in BST
 
    /* Let us create following BST
                 50
                /  \
               /    \
              30     70
             / \     / \
            /   \   /   \
           20   40 60   80
*/
    Node* root = NULL;
    root = insert(root, 50);
    insert(root, 30);
    insert(root, 20);
    insert(root, 40);
    insert(root, 70);
    insert(root, 60);
    insert(root, 80);
 
    Node *pre = NULL, *suc = NULL;
 
    findPreSuc(root, pre, suc, key);
    if (pre != NULL)
        cout << "Predecessor is " << pre->key << endl;
    else
        cout << "-1";
 
    if (suc != NULL)
        cout << "Successor is " << suc->key;
    else
        cout << "-1";
    return 0;
}


Java
// Java program to find predecessor
// and successor in a BST
import java.util.*;
class GFG
{
 
// BST Node
static class Node
{
    int key;
    Node left, right;
};
static Node pre;
static Node suc;
 
// Function that finds predecessor
// and successor of key in BST.
static void findPreSuc(Node root, int key)
{
    if (root == null)
        return;
 
    // Search for given key in BST.
    while (root != null)
    {
 
        // If root is given key.
        if (root.key == key)
        {
 
            // the minimum value in right subtree
            // is successor.
            if (root.right != null)
            {
                suc = root.right;
                while (suc.left != null)
                    suc = suc.left;
            }
 
            // the maximum value in left subtree
            // is predecessor.
            if (root.left != null)
            {
                pre = root.left;
                while (pre.right != null)
                    pre = pre.right;
            }
            return;
        }
 
        // If key is greater than root, then
        // key lies in right subtree. Root
        // could be predecessor if left
        // subtree of key is null.
        else if (root.key < key)
        {
            pre = root;
            root = root.right;
        }
 
        // If key is smaller than root, then
        // key lies in left subtree. Root
        // could be successor if right
        // subtree of key is null.
        else
        {
            suc = root;
            root = root.left;
        }
    }
}
 
// A utility function to create a new BST node
static Node newNode(int item)
{
    Node temp = new Node();
    temp.key = item;
    temp.left = temp.right = null;
    return temp;
}
 
// A utility function to insert
// a new node with given key in BST
static Node insert(Node node, int key)
{
    if (node == null)
        return newNode(key);
    if (key < node.key)
        node.left = insert(node.left, key);
    else
        node.right = insert(node.right, key);
    return node;
}
 
// Driver Code
public static void main(String[] args)
{
    int key = 65; // Key to be searched in BST
 
    /* Let us create following BST
                50
                / \
            / \
            30     70
            / \     / \
            / \ / \
        20 40 60 80
    */
    Node root = null;
    root = insert(root, 50);
    insert(root, 30);
    insert(root, 20);
    insert(root, 40);
    insert(root, 70);
    insert(root, 60);
    insert(root, 80);
 
    findPreSuc(root, key);
    if (pre != null)
        System.out.println("Predecessor is " +
                                     pre.key);
    else
        System.out.print("-1");
 
    if (suc != null)
        System.out.print("Successor is " + suc.key);
    else
        System.out.print("-1");
    }
}
 
// This code is contributed by Princi Singh


Python3
# Python3 program to find predecessor
# and successor in a BST
 
# A utility function to create a
# new BST node
class newNode:
     
    # Constructor to create a new node
    def __init__(self, data):
        self.key = data
        self.left = None
        self.right = None
         
# Function that finds predecessor and
# successor of key in BST.
def findPreSuc(root, pre, suc, key):
    if root == None:
        return
 
    # Search for given key in BST.
    while root != None:
 
        # If root is given key.
        if root.key == key:
 
            # the minimum value in right
            # subtree is predecessor.
            if root.right:
                suc[0] = root.right
                while suc[0].left:
                    suc[0] = suc[0].left
 
            # the maximum value in left
            # subtree is successor.
            if root.left:
                pre[0] = root.left
                while pre[0].right:
                    pre[0] = pre[0].right
 
            return
 
        # If key is greater than root, then
        # key lies in right subtree. Root
        # could be predecessor if left
        # subtree of key is null.
        elif root.key < key:
            pre[0] = root
            root = root.right
 
        # If key is smaller than root, then
        # key lies in left subtree. Root
        # could be successor if right
        # subtree of key is null.
        else:
            suc[0] = root
            root = root.left
 
# A utility function to insert
# a new node with given key in BST
def insert(node, key):
    if node == None:
        return newNode(key)
    if key < node.key:
        node.left = insert(node.left, key)
    else:
        node.right = insert(node.right, key)
    return node
 
# Driver Code
if __name__ == '__main__':
    key = 65 # Key to be searched in BST
 
    # Let us create following BST
    #             50
    #         / \
    #         / \
    #         30     70
    #         / \     / \
    #     / \ / \
    #     20 40 60 80
 
    root = None
    root = insert(root, 50)
    insert(root, 30)
    insert(root, 20)
    insert(root, 40)
    insert(root, 70)
    insert(root, 60)
    insert(root, 80)
 
    pre, suc = [None], [None]
 
    findPreSuc(root, pre, suc, key)
    if pre[0] != None:
        print("Predecessor is", pre[0].key)
    else:
        print("-1")
 
    if suc[0] != None:
        print("Successor is", suc[0].key)
    else:
        print("-1")
 
# This code is contributed by PranchalK


C#
// C# program to find predecessor
// and successor in a BST
using System;
 
class GFG
{
 
// BST Node
class Node
{
    public int key;
    public Node left, right;
};
static Node pre;
static Node suc;
 
// Function that finds predecessor
// and successor of key in BST.
static void findPreSuc(Node root, int key)
{
    if (root == null)
        return;
 
    // Search for given key in BST.
    while (root != null)
    {
 
        // If root is given key.
        if (root.key == key)
        {
 
            // the minimum value in right subtree
            // is predecessor.
            if (root.right != null)
            {
                suc = root.right;
                while (suc.left != null)
                    suc = suc.left;
            }
 
            // the maximum value in left subtree
            // is successor.
            if (root.left != null)
            {
                pre = root.left;
                while (pre.right != null)
                    pre = pre.right;
            }
            return;
        }
 
        // If key is greater than root, then
        // key lies in right subtree. Root
        // could be predecessor if left
        // subtree of key is null.
        else if (root.key < key)
        {
            pre = root;
            root = root.right;
        }
 
        // If key is smaller than root, then
        // key lies in left subtree. Root
        // could be successor if right
        // subtree of key is null.
        else
        {
            suc = root;
            root = root.left;
        }
    }
}
 
// A utility function to create a new BST node
static Node newNode(int item)
{
    Node temp = new Node();
    temp.key = item;
    temp.left = temp.right = null;
    return temp;
}
 
// A utility function to insert
// a new node with given key in BST
static Node insert(Node node, int key)
{
    if (node == null)
        return newNode(key);
    if (key < node.key)
        node.left = insert(node.left, key);
    else
        node.right = insert(node.right, key);
    return node;
}
 
// Driver Code
public static void Main(String[] args)
{
    int key = 65; // Key to be searched in BST
 
    /* Let us create following BST
                50
                / \
            / \
            30     70
            / \     / \
            / \ / \
        20 40 60 80
    */
    Node root = null;
    root = insert(root, 50);
    insert(root, 30);
    insert(root, 20);
    insert(root, 40);
    insert(root, 70);
    insert(root, 60);
    insert(root, 80);
 
    findPreSuc(root, key);
    if (pre != null)
        Console.WriteLine("Predecessor is " +
                                    pre.key);
    else
        Console.Write("-1");
 
    if (suc != null)
        Console.Write("Successor is " + suc.key);
    else
        Console.Write("-1");
    }
}
 
// This code is contributed by PrinciRaj1992


输出:
Predecessor is 60
Successor is 70

时间复杂度: O(N)
辅助空间: O(1)
相关文章:https://www.geeksforgeeks.org/inorder-predecessor-successor-given-key-bst/

如果您希望与行业专家一起参加现场课程,请参阅《 Geeks现场课程》和《 Geeks现场课程美国》。