Дерево двоичного поиска для поиска менеджера сотрудников - PullRequest
0 голосов
/ 13 июля 2020

Я хочу написать программу java, чтобы упорядочить данный идентификатор сотрудника в формате двоичного дерева поиска, а затем найти непосредственного руководителя любого данного сотрудника в организации.

Двоичное дерево сотрудников:

Employee Binary Tree

Input Format

  • The first line should contain the number of employees "n" to be inserted in the Tree
  • The second line should contain the employee ID for which we need to find the immediate manager.
  • The next "n" lines should contain the employee IDs to form the binary search Tree.

Sample:

Sample Output

Below is the code with which I have intialized the tree successfully. I need help on how to search the parent node for a given child node.

import java.util.Scanner;

class BinarySearchTree { 

    /* Class containing left and right child of current node and key value*/
    class Node { 
        int data; 
        int key; 
        Node left, right; 
  
        public Node(int item) { 
            key = item; 
            left = right = null; 
        } 
    } 
    // Root of BST 
    Node root; 

    // Constructor 
    BinarySearchTree() { 
        root = null; 
    } 

    // This method mainly calls insertRec() 
    void insert(int key) { 
    root = insertRec(root, key); 
    } 
    
    /* A recursive function to insert a new key in BST */
    Node insertRec(Node root, int key) { 

        /* If the tree is empty, return a new node */
        if (root == null) { 
            root = new Node(key); 
            return root; 
        } 

        /* Otherwise, recur down the tree */
        if (key < root.key) 
            root.left = insertRec(root.left, key); 
        else if (key > root.key) 
            root.right = insertRec(root.right, key); 

        /* return the (unchanged) node pointer */
        return root; 
    } 

    // This method mainly calls InorderRec() 
    void inorder() { 
    inorderRec(root); 
    } 

    // A utility function to do inorder traversal of BST 
    void inorderRec(Node root) { 
        if (root != null) { 
            inorderRec(root.left); 
            System.out.println(root.key); 
            inorderRec(root.right); 
        } 
    } 

    public static void main(String[] args) { 
        BinarySearchTree tree = new BinarySearchTree(); 
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        //int sch = sc.nextInt();
        for (int i=0;i<num;i++) {
            tree.insert(sc.nextInt()); 
        }
        tree.inorder(); 
    }
}

1 Ответ

0 голосов
/ 21 июля 2020

Когда вы пишете рекурсивный метод, первое, что вам нужно, это условие, которое завершает рекурсию. В вашем случае есть два следующих условия.

  1. Вы нашли сотрудника, которого ищете.
  2. Вы достигли конца дерева.

Рекурсия должна быть прекращена, если выполняется одно из вышеуказанных условий. В вашем случае завершение рекурсии означает, что метод должен возвращать значение.

Если условие завершения не истинно, метод должен вызвать сам себя, но с другими значениями для параметров метода.

Вот мой рекурсивный метод поиска. Дополнительные пояснения появляются после кода.

int search(int employee, int manager, Node node) {
    if (node != null) {
        if (employee == node.key) {
            return manager;
        }
        manager = node.key;
        if (employee < node.key) {
            return search(employee, manager, node.left);
        }
        else {
            return search(employee, manager, node.right);
        }
    }
    else {
        return -1;
    }
}

Параметры метода следующие:

  1. сотрудник - сотрудник, для которого выполняется поиск
  2. менеджер - руководитель следующий параметр
  3. узел - узел в дереве, который будет проверяться, чтобы узнать, является ли его key сотрудником, которого мы ищем

Мы начинаем поиск с root дерева и пройти вниз по узлам дерева. Следовательно, первоначальный вызов метода, который, вероятно, будет в методе main(), будет выглядеть следующим образом:

tree.search(sch, -1, tree.root)

Согласно вашим примерным данным, sch равно 55. Обратите внимание, что при первоначальном вызове менеджер равно -1, поскольку root дерева не имеет менеджера. Таким образом, если sch равно root key, метод вернет -1.

Поскольку мы знаем, что key в левом дочернем узле ниже, а правый дочерний key выше, нам не нужно перебирать каждый узел. Таким образом, метод вызывает себя с соответствующим дочерним узлом. Также мы сохраняем текущий key, потому что если key дочернего узла - это тот, который мы ищем, то key этого узла является менеджером.

Если параметр node в методе search() имеет значение null, это означает, что мы достигли конца дерева, что означает, что мы не нашли искомое значение. Значение -1 (минус один) является условным обозначением значения, которое указывает, что поиск завершился неудачно. Метод indexOf() в классе String является примером метода, также использующего это соглашение.

Наконец, я использовал код, который вы разместили в своем вопросе. Я добавил только указанный выше метод, а также вызов этого метода из метода main(). Я добавил начальный вызов метода search() в качестве последней строки в методе main().

Для полноты, вот весь код:

import java.util.Scanner;

public class BinarySearchTree {
    class Node {
        int key;
        Node left, right;

        public Node(int item) {
            key = item;
            left = right = null;
        }
    }

    // Root of BST
    Node root;

    // Constructor
    BinarySearchTree() {
        root = null;
    }

    // This method mainly calls insertRec()
    void insert(int key) {
        root = insertRec(root, key);
    }

    /* A recursive function to insert a new key in BST */
    Node insertRec(Node root, int key) {

        /* If the tree is empty, return a new node */
        if (root == null) {
            root = new Node(key);
            return root;
        }

        /* Otherwise, recur down the tree */
        if (key < root.key)
            root.left = insertRec(root.left, key);
        else if (key > root.key)
            root.right = insertRec(root.right, key);

        /* return the (unchanged) node pointer */
        return root;
    }

    // This method mainly calls InorderRec()
    void inorder() {
        inorderRec(root);
    }

    // A utility function to do inorder traversal of BST
    void inorderRec(Node root) {
        if (root != null) {
            inorderRec(root.left);
            System.out.println(root.key);
            inorderRec(root.right);
        }
    }

    // The method I added.
    int search(int employee, int manager, Node node) {
        if (node != null) {
            if (employee == node.key) {
                return manager;
            }
            manager = node.key;
            if (employee < node.key) {
                return search(employee, manager, node.left);
            }
            else {
                return search(employee, manager, node.right);
            }
        }
        else {
            return -1;
        }
    }

    public static void main(String[] args) {
        BinarySearchTree tree = new BinarySearchTree();
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        int sch = sc.nextInt();
        for (int i = 0; i < num; i++) {
            tree.insert(sc.nextInt());
        }
        tree.inorder();
        System.out.printf("Manager is %d%n", tree.search(sch, -1, tree.root)); // changed this line to print only manager.
    }
}
...