JAVA中二叉搜索樹的實現

基本性質:首先是一棵二叉樹,其次每個節點的值大於其左子樹上節點的值,小於其右子樹上節點的值。

結構:

public class myBST {

    Node root = null;

    class Node {
        int value;
        Node left_child = null;
        Node right_child = null;

        Node(int value) {
            this.value = value;
        }
    }
}

節點的插入:

public void Insert(int value) {
        if (root == null) {
            root = new Node(value);
            return;
        }

        Node cur = root;
        while (cur != null) {
            if (value < cur.value) {
                if (cur.left_child != null) {
                    cur = cur.left_child;
                } else {
                    cur.left_child = new Node(value);
                    return;
                }
            } else if (value > cur.value) {
                if (cur.right_child != null) {
                    cur = cur.right_child;
                } else {
                    cur.right_child = new Node(value);
                    return;
                }
            }
        }
    }

節點的尋找:

public boolean Find(int value) {
        Node cur = root;
        while (cur != null) {
            if (cur.value == value) {
                return true;
            } else if (cur.value < value) {
                cur = cur.right_child;
            } else {
                cur = cur.left_child;
            }
        }
        return false;
    }

節點的刪除,分爲三種情況:

public boolean Delete(int value) {
        Node parent = root;
        Node cur = root;
        while (cur != null) {
            if (value == cur.value) {
                break;
            } else if (value < cur.value) {
                parent = cur;
                cur = cur.left_child;
            } else {
                parent = cur;
                cur = cur.right_child;
            }
        }

        if (cur == null) {
            //沒有找到
            return false;
        }

        if (cur.left_child == null && cur.right_child == null) {
            if (cur == parent) {
                //是根節點
                root = null;
                return true;
            } else {
                //是葉子節點
                cur = null;
                return true;
            }
        } else if (cur.left_child != null && cur.right_child == null) {
            //待刪除的節點只有左節點
            if (cur == parent) {
                root = cur.left_child;
                return true;
            } else {
                if (cur == parent.left_child) {
                    parent.left_child = cur.left_child;
                    return true;
                } else {
                    parent.right_child = cur.left_child;
                    return true;
                }
            }
        } else if (cur.left_child == null && cur.right_child != null) {
            //待刪除的節點只有右節點
            if (cur == parent) {
                root = cur.right_child;
                return true;
            } else {
                if (cur == parent.left_child) {
                    parent.left_child = cur.right_child;
                    return true;
                } else {
                    parent.right_child = cur.right_child;
                    return true;
                }
            }
        } else {
            //待刪除的節點左節點和右節點都存在
            //將左子樹鏈接到右子樹最左的節點下
            Node temp = cur.right_child;
            while (temp.left_child != null) {
                temp = temp.left_child;
            }
            temp.left_child = cur.left_child;

            if (parent != cur) {
                if (parent.left_child == cur) {
                    parent.left_child = cur.right_child;
                } else {
                    parent.right_child = cur.right_child;
                }
            } else {
                root = cur.right_child;
            }
            return true;
        }
    }

三種遍歷:

    //根、左、右
    public void PreOrder(Node node) {
        if (node != null) {
            System.out.print(node.value + " ");
            PreOrder(node.left_child);
            PreOrder(node.right_child);
        }
    }

    public void PreOrder() {
        PreOrder(root);
    }

    //左、根、右
    public void inOrder(Node node) {
        if (node != null) {
            inOrder(node.left_child);
            System.out.print(node.value + " ");
            inOrder(node.right_child);
        }
    }

    public void inOrder() {
        inOrder(root);
    }

    public void posOrder(Node node) {
        if (node != null) {
            posOrder(node.left_child);
            posOrder(node.right_child);
            System.out.print(node.value + " ");
        }
    }

    public void posOrder() {
        posOrder(root);
    }

完成的程序:

package myBST;

public class myBST {

    Node root = null;

    class Node {
        int value;
        Node left_child = null;
        Node right_child = null;

        Node(int value) {
            this.value = value;
        }
    }

    public void Insert(int value) {
        if (root == null) {
            root = new Node(value);
            return;
        }

        Node cur = root;
        while (cur != null) {
            if (value < cur.value) {
                if (cur.left_child != null) {
                    cur = cur.left_child;
                } else {
                    cur.left_child = new Node(value);
                    return;
                }
            } else if (value > cur.value) {
                if (cur.right_child != null) {
                    cur = cur.right_child;
                } else {
                    cur.right_child = new Node(value);
                    return;
                }
            }
        }
    }

    public boolean Find(int value) {
        Node cur = root;
        while (cur != null) {
            if (cur.value == value) {
                return true;
            } else if (cur.value < value) {
                cur = cur.right_child;
            } else {
                cur = cur.left_child;
            }
        }
        return false;
    }

    public boolean Delete(int value) {
        Node parent = root;
        Node cur = root;
        while (cur != null) {
            if (value == cur.value) {
                break;
            } else if (value < cur.value) {
                parent = cur;
                cur = cur.left_child;
            } else {
                parent = cur;
                cur = cur.right_child;
            }
        }

        if (cur == null) {
            //沒有找到
            return false;
        }

        if (cur.left_child == null && cur.right_child == null) {
            if (cur == parent) {
                //是根節點
                root = null;
                return true;
            } else {
                //是葉子節點
                cur = null;
                return true;
            }
        } else if (cur.left_child != null && cur.right_child == null) {
            //待刪除的節點只有左節點
            if (cur == parent) {
                root = cur.left_child;
                return true;
            } else {
                if (cur == parent.left_child) {
                    parent.left_child = cur.left_child;
                    return true;
                } else {
                    parent.right_child = cur.left_child;
                    return true;
                }
            }
        } else if (cur.left_child == null && cur.right_child != null) {
            //待刪除的節點只有右節點
            if (cur == parent) {
                root = cur.right_child;
                return true;
            } else {
                if (cur == parent.left_child) {
                    parent.left_child = cur.right_child;
                    return true;
                } else {
                    parent.right_child = cur.right_child;
                    return true;
                }
            }
        } else {
            //待刪除的節點左節點和右節點都存在
            //將左子樹鏈接到右子樹最左的節點下
            Node temp = cur.right_child;
            while (temp.left_child != null) {
                temp = temp.left_child;
            }
            temp.left_child = cur.left_child;

            if (parent != cur) {
                if (parent.left_child == cur) {
                    parent.left_child = cur.right_child;
                } else {
                    parent.right_child = cur.right_child;
                }
            } else {
                root = cur.right_child;
            }
            return true;
        }
    }

    //根、左、右
    public void PreOrder(Node node) {
        if (node != null) {
            System.out.print(node.value + " ");
            PreOrder(node.left_child);
            PreOrder(node.right_child);
        }
    }

    public void PreOrder() {
        PreOrder(root);
    }

    //左、根、右
    public void inOrder(Node node) {
        if (node != null) {
            inOrder(node.left_child);
            System.out.print(node.value + " ");
            inOrder(node.right_child);
        }
    }

    public void inOrder() {
        inOrder(root);
    }

    public void posOrder(Node node) {
        if (node != null) {
            posOrder(node.left_child);
            posOrder(node.right_child);
            System.out.print(node.value + " ");
        }
    }

    public void posOrder() {
        posOrder(root);
    }

    public static void main(String[] args) {
        int[] nums = {50, 25, 65, 15, 35, 55, 70, 10, 20, 30, 36};
        myBST bst = new myBST();
        for (int i = 0; i < nums.length; i++) {
            bst.Insert(nums[i]);
        }
        bst.PreOrder();
        System.out.println();
        bst.Delete(50);
        bst.PreOrder();
        System.out.println();
//        System.out.println(bst.Find(33));
    }
}

 

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