二叉排序树的概念:

满足:

1.树的左子树的如果存在,并且左子树的所有节点都小于根节点;

2.树的右子树如果存在并且右子树的所有节点都大于根节点;

3.左子树和右子树同样是二叉排序树;

二叉排序树常用于查找之上:

package com.ydlclass.tree;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Stack;
import java.util.concurrent.ArrayBlockingQueue;

public class BST {
    //二叉排序树

    public static class Node{
        Integer data;
        Node left;
        Node right;

        public Node(Integer data) {
            this.data = data;
        }
    }

    //递归实现树的遍历
    public static void recursive(Node node){
        if (node == null){
            return;
        }
        recursive(node.left);
        recursive(node.right);
    }

    //递归实现前序遍历
    public static void preOrder(Node node){
        if (node == null){
            return;
        }
        System.out.println(node.data);
        preOrder(node.left);
        preOrder(node.right);
    }


    //递归实现中序遍历
    public static void midOrder(Node node){
        if(node == null){
            return;
        }
        midOrder(node.left);
        System.out.println(node.data);
        midOrder(node.right);

    }

    //递归实现后序遍历
    public static void postOrder(Node node){
        if (node == null){
            return;
        }
        postOrder(node.left);
        postOrder(node.right);
        System.out.println(node.data);

    }

    //使用栈实现前序遍历

    public static void stackImplement(Node node){
        Stack<Node> stack = new Stack<>();
        stack.push(node);
        while(!stack.isEmpty()){
            node = stack.pop();
            System.out.println(node.data);
            if(node.right != null){
                stack.push(node.right);
            }
            if (node.left != null){
                stack.push(node.left);
            }
        }
    }

    //使用队列实现层级遍历;
    public static void linkImplement(Node node){
        LinkedList<Node> link = new LinkedList<>();
        link.addFirst(node);
        while (!link.isEmpty()){
            node = link.removeLast();
            System.out.println(node.data);
            if (node.left != null){
                link.addFirst(node.left);
            }
            if (node.right != null){
                link.addFirst(node.right);
            }
        }
    }

    //二叉排序树查找值
    public static void selectVal(Node node,int target){
        while (node != null){
            if (target == node.data){
                System.out.println(node.data);
                if (node.left != null){
                    System.out.println(node.left.data);
                }
                if (node.right != null){
                    System.out.println(node.right.data);//分别验证查找的节点的左子节点和右子节点
                }
                return;
            } else if (target < node.data){
                node = node.left;
            } else if (target > node.data){
                node = node.right;
            }
        }
        return;
    }
    public static void main(String[] args) {
//        Node root = new Node(3);
//        root.left = new Node(5);
//        root.right = new Node(7);
//        root.left.left = new Node(1);
//        root.left.right = new Node(12);
//        root.right.left = new Node(8);
//        root.right.right = new Node(9);
        Node root = new Node(6);
        root.left = new Node(4);
        root.right = new Node(11);
        root.left.left = new Node(1);
        root.left.right = new Node(5);
        root.right.left = new Node(7);
        root.right.right = new Node(12);

//        preOrder(root);
//        System.out.println("___");
//        midOrder(root);
//        System.out.println("___");
//        postOrder(root);
//        System.out.println("___");
//        linkImplement(root);
//        System.out.println("___");
        selectVal(root,4);
    }
}


alt