binary search tree impelementation and java

前端 未结 6 670
离开以前
离开以前 2021-01-03 09:10

I am trying to implement BST algorithm using Cormen\'s pseudo code yet having issue.

Here is my Code for Node:

public class Node {
    Node left;
            


        
相关标签:
6条回答
  • 2021-01-03 09:20

    As per my understanding following implementation done for binary search tree, kindly look into that and let me know any feedback required

    1. Insertion
    2. InOrderTraversal
    3. Search
    4. Removal

    Please take a look at the main method. so, Please provide your's feedback to improve further from my side.

    public class BinarySearchTree {
    
        private Node root;
    
        public  BinarySearchTree() {
            root = null;        
        }
        public BinarySearchTree(int rootData) {
            root = new Node(rootData);
        }
    
        public void insertElement(int element,Node parent) {
    
            Node temp = root;
            if(parent!=null) temp = parent;
    
            if(temp!=null) {
                Node node = new Node(element);
                if(element<temp.getData()) {
                    if(temp.getLeft()!=null)
                        insertElement(element, temp.getLeft());
                    else
                        temp.setLeft(node);
                }else if(element>temp.getData()) {              
                    if(temp.getRight()!=null)
                        insertElement(element, temp.getRight());
                    else
                        temp.setRight(node);
                }
            }
        }
    
    
        public void traverseInOrder() {
            if(root!=null) {
                traverse(root.getLeft());
                System.out.println(root.getData());
                traverse(root.getRight());
            }
        }
    
        public void traverse(Node temp) {       
            if(temp!=null) {
                traverse(temp.getLeft());
                System.out.println(temp.getData());
                traverse(temp.getRight());
    
            }
        }
    
        public int searchElement(int element,Node node) {
    
            Node temp = root;
            if(node!=null) temp = node;
            if(temp!=null) {
                if(temp.getData()<element) {
                    if(temp.getRight()!=null)
                        return searchElement(element, temp.getRight());             
                }else if(temp.getData()>element) {
                    if(temp.getLeft()!=null)
                        return searchElement(element,temp.getLeft());
                }else if(temp.getData()==element){
                    return temp.getData();
                }
            }
            return -1;
        }
    
    
        public void remove(int element,Node node,Node predecer) {
    
            Node temp = root;
            if(node!=null) temp = node;
    
            if(temp!=null) {
                if(temp.getData()>element) {
                    remove(element, temp.getLeft(), temp);
                }else if(temp.getData()<element) {
                    remove(element, temp.getRight(), temp);
                }else if(element==temp.getData()) {
                    if(temp.getLeft()==null && temp.getRight()==null) {
                        if(predecer.getData()>temp.getData()) {
                            predecer.setLeft(null);
                        }else if(predecer.getData()<temp.getData()) {
                            predecer.setRight(null);
                        }
                    }else if(temp.getLeft()!=null && temp.getRight()==null) {
                        predecer.setRight(temp.getLeft());
                    }else if(temp.getLeft()==null && temp.getRight()!=null) {
                        predecer.setLeft(temp.getRight());
                    }else if(temp.getLeft()!=null && temp.getRight()!=null) {
                        Node leftMostElement = findMaximumLeft(temp.getLeft());
                        if(leftMostElement!=null) {
                            remove(leftMostElement.getData(), temp, temp);
                            temp.setData(leftMostElement.getData());
                        }
                    }
                }
            }
        }
        
        public Node findMaximumLeft(Node parent) {
            Node temp = parent;
            if(temp.getRight()!=null)
                return findMaximumLeft(temp.getRight());
            else 
                return temp;
    
        }
        public static void main(String[] args) {
            BinarySearchTree bs = new BinarySearchTree(10);
            bs.insertElement(29, null);
            bs.insertElement(19, null);
            bs.insertElement(209, null);
            bs.insertElement(6, null);
            bs.insertElement(7, null);
            bs.insertElement(17, null);
            bs.insertElement(37, null);
            bs.insertElement(67, null);
            bs.insertElement(-7, null);
    
            bs.remove(6, null, null);
            bs.traverseInOrder();}}
    
    0 讨论(0)
  • 2021-01-03 09:21

    Here is the complete Implementation of Binary Search Tree In Java insert,search,countNodes,traversal,delete,empty,maximum & minimum node,find parent node,print all leaf node, get level,get height, get depth,print left view, mirror view

    import java.util.NoSuchElementException;
    import java.util.Scanner;
    
    import org.junit.experimental.max.MaxCore;
    
    class BSTNode {
    
        BSTNode left = null;
        BSTNode rigth = null;
        int data = 0;
    
        public BSTNode() {
            super();
        }
    
        public BSTNode(int data) {
            this.left = null;
            this.rigth = null;
            this.data = data;
        }
    
        @Override
        public String toString() {
            return "BSTNode [left=" + left + ", rigth=" + rigth + ", data=" + data + "]";
        }
    
    }
    
    
    class BinarySearchTree {
    
        BSTNode root = null;
    
        public BinarySearchTree() {
    
        }
    
        public void insert(int data) {
            BSTNode node = new BSTNode(data);
            if (root == null) {
                root = node;
                return;
            }
    
            BSTNode currentNode = root;
            BSTNode parentNode = null;
    
            while (true) {
                parentNode = currentNode;
                if (currentNode.data == data)
                    throw new IllegalArgumentException("Duplicates nodes note allowed in Binary Search Tree");
    
                if (currentNode.data > data) {
                    currentNode = currentNode.left;
                    if (currentNode == null) {
                        parentNode.left = node;
                        return;
                    }
                } else {
                    currentNode = currentNode.rigth;
                    if (currentNode == null) {
                        parentNode.rigth = node;
                        return;
                    }
                }
            }
        }
    
        public int countNodes() {
            return countNodes(root);
        }
    
        private int countNodes(BSTNode node) {
            if (node == null) {
                return 0;
            } else {
                int count = 1;
                count += countNodes(node.left);
                count += countNodes(node.rigth);
                return count;
            }
        }
    
        public boolean searchNode(int data) {
            if (empty())
                return empty();
            return searchNode(data, root);
        }
    
        public boolean searchNode(int data, BSTNode node) {
            if (node != null) {
                if (node.data == data)
                    return true;
                else if (node.data > data)
                    return searchNode(data, node.left);
                else if (node.data < data)
                    return searchNode(data, node.rigth);
            }
            return false;
        }
    
        public boolean delete(int data) {
            if (empty())
                throw new NoSuchElementException("Tree is Empty");
    
            BSTNode currentNode = root;
            BSTNode parentNode = root;
            boolean isLeftChild = false;
    
            while (currentNode.data != data) {
                parentNode = currentNode;
                if (currentNode.data > data) {
                    isLeftChild = true;
                    currentNode = currentNode.left;
                } else if (currentNode.data < data) {
                    isLeftChild = false;
                    currentNode = currentNode.rigth;
                }
                if (currentNode == null)
                    return false;
            }
    
            // CASE 1: node with no child
            if (currentNode.left == null && currentNode.rigth == null) {
                if (currentNode == root)
                    root = null;
                if (isLeftChild)
                    parentNode.left = null;
                else
                    parentNode.rigth = null;
            }
    
            // CASE 2: if node with only one child
            else if (currentNode.left != null && currentNode.rigth == null) {
                if (root == currentNode) {
                    root = currentNode.left;
                }
                if (isLeftChild)
                    parentNode.left = currentNode.left;
                else
                    parentNode.rigth = currentNode.left;
            } else if (currentNode.rigth != null && currentNode.left == null) {
                if (root == currentNode)
                    root = currentNode.rigth;
                if (isLeftChild)
                    parentNode.left = currentNode.rigth;
                else
                    parentNode.rigth = currentNode.rigth;
            }
    
            // CASE 3: node with two child
            else if (currentNode.left != null && currentNode.rigth != null) {
    
                // Now we have to find minimum element in rigth sub tree
                // that is called successor
                BSTNode successor = getSuccessor(currentNode);
                if (currentNode == root)
                    root = successor;
                if (isLeftChild)
                    parentNode.left = successor;
                else
                    parentNode.rigth = successor;
                successor.left = currentNode.left;
            }
    
            return true;
        }
    
        private BSTNode getSuccessor(BSTNode deleteNode) {
    
            BSTNode successor = null;
            BSTNode parentSuccessor = null;
            BSTNode currentNode = deleteNode.left;
    
            while (currentNode != null) {
                parentSuccessor = successor;
                successor = currentNode;
                currentNode = currentNode.left;
            }
    
            if (successor != deleteNode.rigth) {
                parentSuccessor.left = successor.left;
                successor.rigth = deleteNode.rigth;
            }
    
            return successor;
        }
    
        public int nodeWithMinimumValue() {
            return nodeWithMinimumValue(root);
        }
    
        private int nodeWithMinimumValue(BSTNode node) {
            if (node.left != null)
                return nodeWithMinimumValue(node.left);
            return node.data;
        }
    
        public int nodewithMaximumValue() {
            return nodewithMaximumValue(root);
        }
    
        private int nodewithMaximumValue(BSTNode node) {
            if (node.rigth != null)
                return nodewithMaximumValue(node.rigth);
            return node.data;
        }
    
        public int parent(int data) {
            return parent(root, data);
        }
    
        private int parent(BSTNode node, int data) {
            if (empty())
                throw new IllegalArgumentException("Empty");
            if (root.data == data)
                throw new IllegalArgumentException("No Parent node found");
    
            BSTNode parent = null;
            BSTNode current = node;
    
            while (current.data != data) {
                parent = current;
                if (current.data > data)
                    current = current.left;
                else
                    current = current.rigth;
                if (current == null)
                    throw new IllegalArgumentException(data + " is not a node in tree");
            }
            return parent.data;
        }
    
        public int sibling(int data) {
            return sibling(root, data);
        }
    
        private int sibling(BSTNode node, int data) {
            if (empty())
                throw new IllegalArgumentException("Empty");
            if (root.data == data)
                throw new IllegalArgumentException("No Parent node found");
    
            BSTNode cureent = node;
            BSTNode parent = null;
            boolean isLeft = false;
    
            while (cureent.data != data) {
                parent = cureent;
                if (cureent.data > data) {
                    cureent = cureent.left;
                    isLeft = true;
                } else {
                    cureent = cureent.rigth;
                    isLeft = false;
                }
                if (cureent == null)
                    throw new IllegalArgumentException("No Parent node found");
            }
            if (isLeft) {
                if (parent.rigth != null) {
                    return parent.rigth.data;
                } else
                    throw new IllegalArgumentException("No Sibling is there");
            } else {
                if (parent.left != null)
                    return parent.left.data;
                else
                    throw new IllegalArgumentException("No Sibling is there");
            }
        }
    
        public void leafNodes() {
            if (empty())
                throw new IllegalArgumentException("Empty");
            leafNode(root);
        }
    
        private void leafNode(BSTNode node) {
            if (node == null)
                return;
            if (node.rigth == null && node.left == null)
                System.out.print(node.data + " ");
            leafNode(node.left);
            leafNode(node.rigth);
        }
    
        public int level(int data) {
            if (empty())
                throw new IllegalArgumentException("Empty");
            return level(root, data, 1);
        }
    
        private int level(BSTNode node, int data, int level) {
            if (node == null)
                return 0;
            if (node.data == data)
                return level;
            int result = level(node.left, data, level + 1);
            if (result != 0)
                return result;
            result = level(node.rigth, data, level + 1);
            return result;
        }
    
        public int depth() {
            return depth(root);
        }
    
        private int depth(BSTNode node) {
            if (node == null)
                return 0;
            else
                return 1 + Math.max(depth(node.left), depth(node.rigth));
        }
    
        public int height() {
            return height(root);
        }
    
        private int height(BSTNode node) {
            if (node == null)
                return 0;
            else
                return 1 + Math.max(height(node.left), height(node.rigth));
        }
    
        public void leftView() {
            leftView(root);
        }
    
        private void leftView(BSTNode node) {
            if (node == null)
                return;
            int height = height(node);
    
            for (int i = 1; i <= height; i++) {
                printLeftView(node, i);
            }
        }
    
        private boolean printLeftView(BSTNode node, int level) {
            if (node == null)
                return false;
    
            if (level == 1) {
                System.out.print(node.data + " ");
                return true;
            } else {
                boolean left = printLeftView(node.left, level - 1);
                if (left)
                    return true;
                else
                    return printLeftView(node.rigth, level - 1);
            }
        }
    
        public void mirroeView() {
            BSTNode node = mirroeView(root);
            preorder(node);
            System.out.println();
            inorder(node);
            System.out.println();
            postorder(node);
            System.out.println();
        }
    
        private BSTNode mirroeView(BSTNode node) {
            if (node == null || (node.left == null && node.rigth == null))
                return node;
    
            BSTNode temp = node.left;
            node.left = node.rigth;
            node.rigth = temp;
    
            mirroeView(node.left);
            mirroeView(node.rigth);
            return node;
        }
    
        public void preorder() {
            preorder(root);
        }
    
        private void preorder(BSTNode node) {
            if (node != null) {
                System.out.print(node.data + " ");
                preorder(node.left);
                preorder(node.rigth);
            }
        }
    
        public void inorder() {
            inorder(root);
        }
    
        private void inorder(BSTNode node) {
            if (node != null) {
                inorder(node.left);
                System.out.print(node.data + " ");
                inorder(node.rigth);
            }
        }
    
        public void postorder() {
            postorder(root);
        }
    
        private void postorder(BSTNode node) {
            if (node != null) {
                postorder(node.left);
                postorder(node.rigth);
                System.out.print(node.data + " ");
            }
        }
    
        public boolean empty() {
            return root == null;
        }
    
    }
    
    public class BinarySearchTreeTest {
        public static void main(String[] l) {
            System.out.println("Weleome to Binary Search Tree");
            Scanner scanner = new Scanner(System.in);
            boolean yes = true;
            BinarySearchTree tree = new BinarySearchTree();
            do {
                System.out.println("\n1. Insert");
                System.out.println("2. Search Node");
                System.out.println("3. Count Node");
                System.out.println("4. Empty Status");
                System.out.println("5. Delete Node");
                System.out.println("6. Node with Minimum Value");
                System.out.println("7. Node with Maximum Value");
                System.out.println("8. Find Parent node");
                System.out.println("9. Count no of links");
                System.out.println("10. Get the sibling of any node");
                System.out.println("11. Print all the leaf node");
                System.out.println("12. Get the level of node");
                System.out.println("13. Depth of the tree");
                System.out.println("14. Height of Binary Tree");
                System.out.println("15. Left View");
                System.out.println("16. Mirror Image of Binary Tree");
                System.out.println("Enter Your Choice :: ");
                int choice = scanner.nextInt();
                switch (choice) {
                case 1:
                    try {
                        System.out.println("Enter Value");
                        tree.insert(scanner.nextInt());
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
    
                case 2:
                    System.out.println("Enter the node");
                    System.out.println(tree.searchNode(scanner.nextInt()));
                    break;
    
                case 3:
                    System.out.println(tree.countNodes());
                    break;
    
                case 4:
                    System.out.println(tree.empty());
                    break;
    
                case 5:
                    try {
                        System.out.println("Enter the node");
                        System.out.println(tree.delete(scanner.nextInt()));
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
    
                case 6:
                    try {
                        System.out.println(tree.nodeWithMinimumValue());
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
    
                case 7:
                    try {
                        System.out.println(tree.nodewithMaximumValue());
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
    
                case 8:
                    try {
                        System.out.println("Enter the node");
                        System.out.println(tree.parent(scanner.nextInt()));
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
    
                case 9:
                    try {
                        System.out.println(tree.countNodes() - 1);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
    
                case 10:
                    try {
                        System.out.println("Enter the node");
                        System.out.println(tree.sibling(scanner.nextInt()));
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
    
                case 11:
                    try {
                        tree.leafNodes();
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
    
                case 12:
                    try {
                        System.out.println("Enter the node");
                        System.out.println("Level is : " + tree.level(scanner.nextInt()));
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
    
                case 13:
                    try {
                        System.out.println(tree.depth());
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
    
                case 14:
                    try {
                        System.out.println(tree.height());
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
    
                case 15:
                    try {
                        tree.leftView();
                        System.out.println();
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
    
                case 16:
                    try {
                        tree.mirroeView();
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
    
                default:
                    break;
                }
                tree.preorder();
                System.out.println();
                tree.inorder();
                System.out.println();
                tree.postorder();
            } while (yes);
            scanner.close();
        }
    }
    
    0 讨论(0)
  • 2021-01-03 09:22

    ...what is up with your delete code? It doesn't make a lot of sense. I would consider rewriting it in a more logical way. Without the meaningless single-letter variable names. And add comments!

    One possible algorithm is:

    Get the parent of the node to delete
    Get the right-most node of the left subtree, or the leftmost node of the right subtree
    Remove the node to delete and replace it with the node you found
    Rebalance the tree
    

    ...or, if you want to hack up this stuff so it's right, I'd start looking at the

    if (x != null){
        Node tmp = getParent(t,x);
        tmp = getParent(t,y);
    }
    

    part, because that's clearly wrong.

    0 讨论(0)
  • 2021-01-03 09:34

    Some immediate problems with your code: your treeSuccessor starts with

        if (x.right == null){
            return treeMinimum(x.right);
        }
    

    which should be if (x.right != null), of course.

    Your insert code has the lines

        Node tmp = getParent(t,z);
        tmp = y;
    

    where you assign to tmp and immediately assign to it again. It doesn't seem to me that you need these lines at all, since you don't use tmp further on. At this moment, you have y being the node to whose child z gets inserted, so just delete these lines.

    Again, in delete, you have the lines

        if (x != null){
            Node tmp = getParent(t,x);
            tmp = getParent(t,y);
        }
    

    where you don't actually do anything, since tmp is not visible outside this snippet. And further on, in delete, you repeat the expression getParent(t,y), which can be an expensive operation, so you should compute it only once and assign it to some variable.

    But in general, your code, though it seems correct (probably apart from delete, which I did not understand completely but which looks suspicious), does not much resemble typical binary tree code. You don't really need the getParent and treeSuccessor methods to implement search, insert, and delete. The basic structure that you have for search works for the others too, with the following modifications:

    • with insert, when you get to a null link, instead of returning null, insert the element to that point
    • with delete, when you find the element, if it has only one (or no) child, replace it with that child, and if it has two children, replace it with either the maximum of the left child tree or the minimum of the right child tree

    Both of these require in addition that you keep track of the parent node while descending into the tree, but that's the only modification you need to make to search. In particular, there is never any need to go upwards in the tree (which treeSuccessor will do).

    0 讨论(0)
  • 2021-01-03 09:36

    I'll have to side with Anon and go for the rewrite. The null pointers come from your getParent function (which explicitly returns nulls along other things). So I would start there and fix the function(s) so that they return one thing and one thing only at the end of the function.

    0 讨论(0)
  • First of all, your implementation got nothing to do with object orientation (except using objects). The insert and delete operations for example should operate ON the Tree.

    Besides, I would recommend to implement the Node class as a static member of the Tree class.

    public class Tree {
        private Node root = null;
    
        // remainder omitted
    
        public boolean insert(int element) {
            if (isEmpty()) {
                root = new Node(element);
    
                return true; // empty tree, Node could be inserted, return true
            }
    
             Node current = root; // start at root
             Node parent;         // the current Node's parent
    
             do {
                 parent = current;
    
                 if (element < current.element) {
                     current = current.left; // go to left
                 } else if (element > current.element) {
                     current = current.right; // go to right
                 } else {
                     return false;  // duplicates are NOT allowed, element could not be inserted -> return false
    
             } while (current != null);
    
             Node node = new Node(element);
    
             if (element < current.element) {
                 parent.left = node;
             } else {
                 parent.right = node;
             }
    
             return true; // node successfully inserted
        }
    
        public boolean isEmpty() {
            return root == null;
        }
    
        private static class Node { // static member class
            Node left  = null;
            Node right = null;
            final int element;
    
            Node(int element) {
                this.element = element;
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题