数据结构(7):二分搜索树

一、定义

1.二分搜树是二叉树

2.二分搜索树的每个节点的值的特性

   (1)大于其左子树的所有节点的值
   (2)小于其右子树的所有节点的值

3.每一棵子树也是二分搜索树

二、代码实现功能

1.添加元素

2.遍历元素

(1)前序遍历顺序实现:
      -> 节点
      ->  preOrder(node.left);
      ->  preOrder(node.right);       
        
(2)中序遍历实现:
      ->  preOrder(node.left);
      ->  节点
      ->  preOrder(node.right);
            特点:节点从小到大

(3)后序遍历实现:

      ->  preOrder(node.left);
      ->  preOrder(node.right);
      ->  节点        
            应用场景:必须先处理节点的左右节点,然后,再处理节点。例如为二分搜索树释放内存。

(4)前序遍历的非递归实现:

      借助stack栈实现

(5)层序遍历实现:

      借助queue队列实现

3.搜索

(1)搜索最小值

(2)搜索最大值

4.删除

(1)删除最小值

(2)删除最大值

(3)删除任意节点

   -》 删除左右都有孩子的节点d,
        首先,找到d的右节点的最小值s=min(d->right)
        然后,构建s:
                        s->right=delMin(d->right)
                        s->left=d->left
        最后,删除d,使用s是替换根节点d                

三、java代码实现

package com.DataStructures._06BinarySearchTree;

import java.util.*;

/**
 * Created by Administrator on 2018/12/16.
 */
public class BSTimprove> {

    //节点类
    private  class Node{
        public E e;
        public Node left,right;

        public Node(E e){
            this.e=e;
            left=null;
            right=null;
        }
    }

    //根节点信息
    private Node root;
    private int size;

    public BSTimprove(){
        root=null;
        size=0;
    }

    //***************************************************************
    //1.获得基本信息
    public int size(){
        return size;
    }

    public boolean isEmpty(){
        return size==0;
    }

    //***************************************************************
    //2.添加新元素

    /**
     * 2.1向二分搜索树中添加新元素
     * @param e
     */
    public  void add(E e){
//        if(root==null){
//            root=new Node(e);
//            size++;
//        }else {
//            add(root,e);
//        }
        root=add(root,e);
    }

    /**
     * 2.2向以node为根的二分搜索树中插入元素e,递归算法
     * 返回插入新节点后二分搜索树的根
     * @param node
     * @param e
     * @return
     */
    private Node add(Node node,E e){

        if(node==null){
            size++;
            return new Node(e);
        }

        if(e.compareTo(node.e)<0){
            node.left= add(node.left,e);
        }else if(e.compareTo(node.e)>0){
            node.right=add(node.right,e);
        }
        return node;

    }

    //***************************************************************
    //3.查询

    /**
     * 3.1查询是否包含某个元素
     * @param e
     * @return
     */
    public boolean contains(E e){
        return contains(root,e);
    }

    private boolean contains(Node node,E e){
        if(node==null)
            return false;


        if(e.compareTo(node.e)==0){
            return true;
        }else if(e.compareTo(node.e)<0){
            return contains(node.left,e);
        }else{
            return contains(node.right,e);
        }
    }


    /**
     * 3.2 二分搜索树的前序遍历
     */
    public void preOrder(){
        preOrder(root);
    }
    // 前序遍历以node为根的二分搜索树, 递归算法
    private void preOrder(Node node){
        if(node==null){
            return;
        }

        System.out.println(node.e);
        preOrder(node.left);
        preOrder(node.right);
    }


    /**
     * 3.3 非递归前序遍历
     */
    public void preOrderNR(){
        if (root==null){
            return;
        }

        Stack stack=new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()){
            Node cur=stack.pop();
            System.out.println(cur.e);

            if(cur.right!=null){
                stack.push(cur.right);
            }
            if(cur.left!=null){
                stack.push(cur.left);
            }
        }
    }

    /**
     * 3.4 二分搜索树的层序遍历
     */
    public void levelOrder(){
        Queue q=new LinkedList<>();
        q.add(root);
        while (!q.isEmpty()){
            Node cur=q.remove();
            System.out.println(cur.e);

            if(cur.left!=null){
                q.add(cur.left);
            }
            if(cur.right!=null){
                q.add(cur.right);
            }
        }
    }


    /**
     * 3.5 二分搜索树的中序遍历
     */
    public void inOrder(){
        inOrder(root);
    }
    // 中序遍历以node为根的二分搜索树, 递归算法
    private void inOrder(Node node){
        if(node==null)
            return;

        inOrder(node.left);
        System.out.println(node.e);
        inOrder(node.right);
    }

    /**
     * 3.6 后序遍历
     */
    public void postOrder(){
        postOrder(root);
    }


    private void postOrder(Node node){
        if(node==null)
            return;

        postOrder(node.left);
        postOrder(node.right);
        System.out.println(node.e);
    }
    //*****************************************************
    //辅助函数:
    @Override
    public String toString(){
        StringBuilder res=new StringBuilder();
        generateBSTString(root,0,res);
        return res.toString();
    }

    private void generateBSTString(Node node,int depth,StringBuilder res){

        if(node==null){
            res.append(generateDepthString(depth)+"null\n");
            return;
        }

        res.append(generateDepthString(depth)+node.e+"\n");

        generateBSTString(node.left,depth+1,res);
        generateBSTString(node.right,depth+1,res);
    }

    private String generateDepthString(int depth){
        StringBuilder res=new StringBuilder();
        for (int i=0;i0){
            node.right=remove(node.right,e);
            return node;
        }else { // e.compareTo(node.e) == 0
            //待删除节点左子树为空
            if(node.left==null){
                Node rightNode=node.right;
                node.right=null;
                size--;
                return rightNode;
            }

            // 待删除节点右子树为空的情况
            if(node.right==null){
                Node leftNode=node.left;
                node.left=null;
                size--;
                return leftNode;
            }

            // 待删除节点左右子树均不为空的情况
            // 找到比待删除节点大的最小节点, 即待删除节点右子树的最小节点
            // 用这个节点顶替待删除节点的位置
            Node successor=minimum(node.right);
            successor.right=removeMin(node.right);
            successor.left=node.left;
            node.left=null;
            node.right=null;
            return successor;

        }


    }

    //*****************************************************


    //*****************************************************

    public static void main(String[] args) {
//        BSTimprove bst=new BSTimprove<>();
//        int[] nums={5,4,23,4,23,534,3,34,32,189};
//        for (int num:nums){
//            bst.add(num);
//        }
//        bst.preOrder();
//        System.out.println();
//
//        //遍历打印
////        System.out.println(bst);
//
//        bst.inOrder();
//        System.out.println();
//
//        bst.postOrder();
//        System.out.println();
//
//        bst.levelOrder();

        //test2
        BSTimprove bst=new BSTimprove<>();
        Random random=new Random();

        int n=1000;
        for (int i =0;i nums=new ArrayList<>();
        while (!bst.isEmpty()){
            nums.add(bst.removeMin());
        }
        System.out.println(nums);
    }
}

 

 

你可能感兴趣的:(数据结构)