zoukankan      html  css  js  c++  java
  • 二叉搜索树的实现

    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.Stack;
    
    public class BST<Key extends Comparable<Key>, Value> {
        private Node root;
    
        public class Node {
            private Key key;
            private Value val;
            private Node parent, left, right;
            private int height;
    
            private Node(Key key, Value val, int height, Node parent) {
                this.key = key;
                this.val = val;
                this.height = height;
                this.parent = parent;
                this.left = this.right = null;
            }
        }
    
        public int size(Node x) {
            return x.height;
        }
    
        private void UpdateHeight(Node x) {
            while (true) {
                if (x.left == null && x.right == null) {
                } else if (x.left == null)
                    x.height = x.right.height + 1;
                else if (x.right == null)
                    x.height = x.left.height + 1;
                else
                    x.height = (x.left.height == x.right.height ? x.left.height : x.left.height > x.right.height ? x.left.height : x.right.height) + 1;
                if (x.parent == null)
                    break;
                else
                    x = x.parent;
            }
            root = x;
        }
    
        public int Search(Key key) {
            return SearchIn(root, key);
        }
    
        private int SearchIn(Node t, Key key) {
            if (t == null)
                return 0;
            else if (key.compareTo(t.key) == 0)
                return t.height;
            return SearchIn(key.compareTo(t.key) < 0 ? t.left : t.right, key);
        }
    
    
        public void Insert(Key key, Value val) {
            if (root == null)
                root = new Node(key, val, 0, null);
            Node temp = root;
            while (true) {
                int cmp = key.compareTo(temp.key);
                if (cmp < 0) {
                    if (temp.left == null) {
                        temp.left = new Node(key, val, 0, temp);
                        UpdateHeight(temp);
                        return;
                    } else
                        temp = temp.left;
                } else if (cmp > 0) {
                    if (temp.right == null) {
                        temp.right = new Node(key, val, 0, temp);
                        UpdateHeight(temp);
                        return;
                    } else
                        temp = temp.right;
                } else {
                    temp.val = val;
                    return;
                }
            }
        }
    
        public Node Remove(Key key) {
            Node temp_root = root;
            if (root == null || key == null)
                return null;
            while (temp_root != null) {
                int cmp = key.compareTo(temp_root.key);
                if (cmp > 0)
                    temp_root = temp_root.right;
                else if (cmp < 0)
                    temp_root = temp_root.left;
                else {
                    if (temp_root.left == null || temp_root.right == null) {
                        if (temp_root.left != null) {
                            temp_root.key = temp_root.left.key;
                            temp_root.val = temp_root.left.val;
                            temp_root.left = temp_root.left.left;
                            temp_root.right = temp_root.left.right;
                        } else if (temp_root.right != null) {
                            temp_root.key = temp_root.right.key;
                            temp_root.val = temp_root.right.val;
                            temp_root.left = temp_root.right.left;
                            temp_root.right = temp_root.right.right;
                        } else {
                            temp_root = temp_root.parent;
                            if (temp_root.left != null && temp_root.left.key == key)
                                temp_root.left = null;
                            else
                                temp_root.right = null;
                        }
                        UpdateHeight(temp_root);
                    } else {
                        Node t = temp_root.right;
                        while (t.left != null)
                            t = t.left;
                        temp_root.key = t.key;
                        temp_root.val = t.val;
                        if (t.right != null) {
                            t.key = t.right.key;
                            t.val = t.right.val;
                            t.left = t.right.left;
                            t.right = t.right.right;
                        } else {
                            t.parent.left = null;
                        }
                        UpdateHeight(t);
                    }
                    return root;
                }
            }
            return root;
        }
    
        public Queue<Key> Inorder() {                    //先序遍历
            Queue<Key> keys = new LinkedList<>();
            Stack<Node> stack = new Stack<Node>();
            stack.push(root);
            Node node = root;
            while (true) {
                if (node != null) {
                    stack.push(node);
                    node = node.left;
                } else if (!stack.isEmpty()) {
                    node = stack.pop();
                    keys.offer(node.key);
                    node = node.right;
                } else
                    break;
            }
            return keys;
        }
    
        public Queue<Key> LevelOrder() {                    //层次遍历
            Queue<Key> keys = new LinkedList<Key>();
            Queue<Node> nodes = new LinkedList<Node>();
            Node node = root;
            nodes.offer(node);
            while (!nodes.isEmpty()) {
                Node x = ((LinkedList<Node>) nodes).pop();
                keys.offer(x.key);
                if (x.left != null)
                    nodes.offer(x.left);
                if (x.right != null)
                    nodes.offer(x.right);
            }
            return keys;
        }
    
        public static void main(String args[]) {
            BST<Integer, Integer> tt = new BST<Integer, Integer>();
            for (int i = 0; i < 10; i++) {
                int x = (int) (Math.random() * 50);
                tt.Insert(x, i);
                System.out.println(x);
            }
            for (Integer i : tt.LevelOrder())
                System.out.println(i + " : " + tt.Search(i));
            tt.Remove(30);
            System.out.println("---------------------");
            for (Integer i : tt.LevelOrder())
                System.out.println(i + " : " + tt.Search(i));
            System.out.println("断点设置处");
        }
    }
  • 相关阅读:
    JavaScript 面向对象的编程(二) 类的封装
    js 防止重复提交表单
    JavaScript 面向对象的编程(一)
    layui laypage 当前页刷新问题
    jquery 选中设置的值
    突然觉得前端js挺不错的
    centos6.8 安装gitlab记录
    3/25/2018 学**况
    Threading、multiprocessing
    正则表达式 RegEx(Regular Expression)
  • 原文地址:https://www.cnblogs.com/INnoVationv2/p/8911665.html
Copyright © 2011-2022 走看看