二叉搜索樹

1 重要特性

在這裏插入圖片描述

2 完整代碼

2.1 二叉搜索樹的節點

/**
 * 二叉搜索樹的節點
 * Created by JayLai on 2019-10-05 22:45:58
 */
public class Node {

    //索引
    int id;

    //數據項
    String name;

    //右子節點
    Node rightNode;

    //左子節點
    Node leftNode;


    /**
     * 構造方法
     * @param id
     * @param name
     */
    public Node(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

2.2 二叉搜索樹的增刪查

/**
 * 二叉搜索樹
 * Created by JayLai on 2019-10-05 22:45:58
 */
public class BinarySearchTree {

    private Node root;

    public BinarySearchTree() {
        this.root = null;
    }

    /**
     * 插入新節點
     * @param id 索引
     * @param name 數據項
     */
    public void insert(int id, String name){
        Node newNode = new Node(id, name);
        newNode.id = id;
        if(root == null){
            root = newNode;
        }else {
            Node current = root;
            Node parent;
            while (current != null){
                parent = current;
                if(current.id > newNode.id){
                    current = current.leftNode;
                    if (current == null){
                        parent.leftNode = newNode;
                        return;
                    }
                } else{
                    current = current.rightNode;
                    if(current == null){
                        parent.rightNode = newNode;
                        return;
                    }
                }
            }
        }
    }



    /**
     * 前序遍歷
     * @param current
     */
    public void preOrder(Node current){
        if (current == null){
            return;
        }
        System.out.println("id:" + current.id + ", name:" + current.name);
        preOrder(current.leftNode);
        preOrder(current.rightNode);

    }

    /**
     * 中序遍歷
     */
    public void inOrder(Node current){
        if (current == null){
            return;
        }
        inOrder(current.leftNode);
        System.out.println("id:" + current.id + ", name:" + current.name);
        inOrder(current.rightNode);
    }

    /**
     * 後序遍歷
     * @param current
     */
    public void postOrder(Node current){
        if (current == null){
            return;
        }
        postOrder(current.leftNode);
        postOrder(current.rightNode);
        System.out.println("id:" + current.id + ", name:" + current.name);
    }

    /**
     * 查找
     * @param id
     * @return
     */
    public Node find(int id){
        if (root == null){  //空樹
            return null;
        }
        Node current = root;
        while (current.id != id){
           if(current.id > id){
               current = current.leftNode;
           }else{
               current = current.rightNode;
           }
           if(current == null){
               return null;
           }
        }
        return current;
    }

    /**
     * 查找中序後繼節點
     * @param delNode
     * @return
     */
    public Node getSuccessor(Node delNode){
        Node successor = delNode;
        Node successorParnt = delNode;
        Node current = delNode.rightNode;


        while(current != null){
            successorParnt = successor;
            successor = current;
            current = current.leftNode;
        }

        if(successor != delNode.rightNode){
            successorParnt.leftNode = successor.rightNode;
            successor.rightNode = delNode.rightNode;
        }

        return successor;
    }


    /**
     * 刪除節點
     * @param id
     * @return
     */
    public Node delete(int id){
        if (root == null){  //空樹
            return null;
        }

        Node current = root;
        Node parent = root ;
        boolean isLeftNode = true;

        //查找要刪除節點
        while (current.id != id){
            parent = current;
            if(current.id > id){
                current = current.leftNode;
                isLeftNode = true;
            }else{
                current = current.rightNode;
                isLeftNode = false;
            }

            if(current == null){
                return null;
            }
        }


        //待刪除的節點是葉子節點
        if (current.leftNode == null && current.rightNode == null){
            if(current == root){
                root = null;
            } else if (isLeftNode){
                parent.leftNode = null;
            }else{
                parent.rightNode = null;
            }

         //待刪除的節點下有一個子節點
        }else if( current.rightNode == null){
            if(current == root){
                root = current.leftNode;
            }else if (isLeftNode){
                parent.leftNode = current.leftNode;
            }else{
                parent.rightNode = current.leftNode;
            }
        }else if(current.leftNode == null) {
            if(current == root){
                root = current.rightNode;
            }else if (isLeftNode) {
                parent.leftNode = current.rightNode;
            } else {
                parent.rightNode = current.rightNode;
            }

       //待刪除的節點下有兩個子節點,用中續後繼來代替該節點
        }else{
            Node successor = getSuccessor(current);
            if(current == root){
                root = successor;
            }
            else if (isLeftNode){
               parent.leftNode = successor;
            }else{
                parent.rightNode = successor;
            }
           successor.leftNode =  current.leftNode;
        }

        return current;
    }


    /**
     * 測試
     * @param args
     */
    public static void main(String[] args) {
        BinarySearchTree tree = new BinarySearchTree();

        //添加
        tree.insert(10, "DuDu");
        tree.insert(20, "LiLi");
        tree.insert(15, "LiYang");
        tree.insert(3, "Tom");
        tree.insert(4, "Jay");
        tree.insert(90, "Angle");
        tree.insert(2, "XiaoMing");
        tree.insert(80, "ZhangSan");
        tree.insert(95, "LiSi");
        tree.inOrder(tree.root);
        System.out.println();

        //查找
        Node node = tree.find(20);
        if( node != null){
            System.out.println("id:" + node.id + ", name:" + node.name);
        }
        System.out.println();

        //刪除
        tree.delete(20);
        tree.inOrder(tree.root);
        
    }
}

3 測試結果分析

在這裏插入圖片描述

在這裏插入圖片描述

4 參考文獻

[1] Robert, Lafore., Java數據結構和算法.第2版 版. 2004: 中國電力出版社.
[2] Sedgewick Robert與Wayne Kevin., 算法. 2012: 人民郵電出版社.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章