二叉树基本操作实现

package com.cskaoyan.bst;

import sun.reflect.generics.tree.Tree;

import javax.swing.text.AsyncBoxView;
import java.util.ArrayList;
import java.util.List;

/*
增:
    boolean add(E e)
删:
    boolean remove(E e)
查找:
    boolean contains(E e)
    E min()
    E max()
遍历:
    List<E> preOrder()
    List<E> inOrder()
    List<E> postOrder()
    List<E> levelOrder()
获取集合的属性:
    int height()
    boolean isEmpty()
    int size()
建树:
    static <T> BinarySearchTree buildTree(List<T> preOrder, List<T> inOrder);
 */
public class BinarySearchTree<E extends Comparable<? super E>> {
    
    
    // 属性
    private TreeNode root;
    private int size;

    private class TreeNode {
    
    
        TreeNode left;
        E value;
        TreeNode right;

        public TreeNode(E value) {
    
    
            this.value = value;
        }

        public TreeNode(TreeNode left, E value, TreeNode right) {
    
    
            this.left = left;
            this.value = value;
            this.right = right;
        }
    }

    /**
     * 在BST添加元素e
     *
     * @param e 待添加的元素
     * @return 如果添加成功返回true, 否则返回false
     */
    public boolean add(E e) {
    
    
        /*// 空树
        if (root == null) {
            root = new TreeNode(e);
            size++;
            return true;
        }
        // 根结点不为空
        TreeNode p = null;
        TreeNode x = root;
        int cmp;
        do {
            cmp = e.compareTo(x.value);
            if (cmp == 0) return false;
            else if (cmp < 0) {
                p = x;
                x = x.left;
            } else {
                p = x;
                x = x.right;
            }
        } while (x != null);
        // x == null, 当前位置就是要添加的位置
        if (cmp < 0) p.left = new TreeNode(e);
        else p.right = new TreeNode(e);
        size++;
        return true;*/
        // 递归实现
        int oldSize = size;
        root = add(root, e);
        return size > oldSize;
    }

    private TreeNode add(TreeNode node, E e) {
    
    
        if (node == null) {
    
    
            size++;
            return new TreeNode(e);
        }
        int cmp = e.compareTo(node.value);
        // 通过赋值语句把新建的结点链接起来的
        if (cmp < 0) node.left = add(node.left, e);
        else if (cmp > 0) node.right = add(node.right, e);
        return node;
    }

    /**
     * 删除BST中与指定对象e相等的元素
     *
     * @param e 指定对象
     * @return 如果删除成功返回true, 否则返回false
     */
    public boolean remove(E e) {
    
    
        TreeNode p = null;
        TreeNode x = root;
        while (x != null) {
    
    
            int cmp = e.compareTo(x.value);
            if (cmp == 0) break;
            else if (cmp < 0) {
    
    
                p = x;
                x = x.left;
            } else {
    
    
                p = x;
                x = x.right;
            }
        }
        // 没有与指定对象相等的元素 x == null
        if (x == null) return false;

        // 判断x是不是度为2的结点
        if (x.left != null && x.right != null) {
    
    
            // 将右子树中最小结点替换x结点的值
            TreeNode minP = x;
            TreeNode minX = x.right;
            while (minX.left != null) {
    
    
                minP = minX;
                minX = minX.left;
            }
            // minX.left == null
            // 用右子树中元素替换该结点的元素
            x.value = minX.value;
            // 删除右子树中最小结点
            p = minP;
            x = minX;
        }

        // 删除x结点(度为0或者度为1)
        TreeNode child = x.left != null ? x.left : x.right;
        // 判断删除的是不是根结点
        if (p == null) root = child;
        else {
    
    
            if (p.left == x) p.left = child;
            else p.right = child;
        }
        size--;
        return true;
    }

    public boolean contains(E e) {
    
    
        TreeNode x = root;
        while (x != null) {
    
    
            int cmp = e.compareTo(x.value);
            if (cmp == 0) return true;
            else if (cmp < 0) x = x.left;
            else x = x.right;
        }
        // x == null
        return false;
    }

    /**
     * 获取BST中最小的元素,如果是空树返回null
     *
     * @return BST中最小的元素, 如果是空树返回null
     */
    public E min() {
    
    
        if (isEmpty()) return null;
        TreeNode x = root;
        while (x.left != null) {
    
    
            x = x.left;
        }
        // x.left == null
        return x.value;
    }

    /**
     * 获取BST中最大的元素,如果是空树返回null
     *
     * @return BST中最大的元素, 如果是空树返回null
     */
    public E max() {
    
    
        if (isEmpty()) return null;
        TreeNode x = root;
        while (x.right != null) {
    
    
            x = x.right;
        }
        // x.right == null
        return x.value;
    }

    public int size() {
    
    
        return size;
    }

    /**
     * 判断BST是否是一棵空树
     *
     * @return 如果BST是空树返回true, 否则返回false
     */
    public boolean isEmpty() {
    
    
        return root == null;
    }

    public List<E> preOrder() {
    
    
        // 如果是空树,就返回空集合,不要返回null
        List<E> list = new ArrayList<>();
        preOrder(root, list);
        return list;
    }

    private void preOrder(TreeNode node, List<E> list) {
    
    
        if (node == null) return;
        // 遍历根节点
        list.add(node.value);
        // 遍历左子树
        preOrder(node.left, list);
        // 遍历右子树
        preOrder(node.right, list);
    }

    public List<E> inOrder() {
    
    
        List<E> list = new ArrayList<>();
        inOrder(root, list);
        return list;
    }

    private void inOrder(TreeNode node, List<E> list) {
    
    
        if (node == null) return;
        // 遍历左子树
        inOrder(node.left, list);
        // 遍历根节点
        list.add(node.value);
        // 遍历右子树
        inOrder(node.right, list);
    }

    public static void main(String[] args) {
    
    
        BinarySearchTree<Character> tree = new BinarySearchTree<>();
        /*System.out.println(tree.size());
        System.out.println(tree.preOrder());
        System.out.println(tree.inOrder());*/
        tree.add('C');
        tree.add('A');
        tree.add('D');
        tree.add('B');
        tree.add('E');
        /*System.out.println(tree.size());
        System.out.println(tree.preOrder()); // [C, A, B, D, E]
        // 中序是排好序的
        System.out.println(tree.inOrder()); // [A, B, C, D, E]*/

        // contains(E e)
        /*System.out.println(tree.contains('A')); // true
        System.out.println(tree.contains('X')); // false
        System.out.println(tree.contains(null)); // NullPointerException*/

        /*System.out.println(tree.isEmpty());
        System.out.println(tree.min());
        System.out.println(tree.max());*/

        // remove()
        // 删除度为0
        /*System.out.println(tree.remove('B'));
        System.out.println(tree.size());
        System.out.println(tree.preOrder()); //[C, A, D, E]
        System.out.println(tree.inOrder());*/

        //删除度为1
        /*System.out.println(tree.remove('D'));
        System.out.println(tree.size());
        System.out.println(tree.preOrder()); //[C, A, B, E]
        System.out.println(tree.inOrder());*/

        // 删除度为2
        /*System.out.println(tree.remove('C'));
        System.out.println(tree.size());
        System.out.println(tree.preOrder()); //[D, A, B, E]
        System.out.println(tree.inOrder());*/

        // 删除不存在的
        System.out.println(tree.remove('X'));
        System.out.println(tree.size());
        System.out.println(tree.preOrder()); //[C, A, B, D, E]
        System.out.println(tree.inOrder());
    }
}

猜你喜欢

转载自blog.csdn.net/qq_31702655/article/details/105252661
今日推荐