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));
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值