二叉搜索树

  • 二叉搜索树:又叫二叉排序树,二叉查找树。
    定义:或者是一棵空树,或者是具备以下特性的非空数:若它的左子树不为空,那么左子树上的结点的值均小于根结点的值;若它的右子树不为空,则右子树上的结点的值均大于根结点的值。

  • 下面来看二叉搜索树的具体操作

1、创建

使用递归算法,确定一个根结点,然后比根结点小的放左边,大的放右边,具体代码实现如下

public static TreeNode SortBinaryTree(TreeNode node, int i) {

        if(node == null) {

            node = new TreeNode(i);
            return node;
        } else {

            if(i <= node.val) {

                node.left = SortBinaryTree(node.left, i);

            } else {

                node.right = SortBinaryTree(node.right, i);
            }
        }

        return node;
    }

测试,利用中序遍历,看中序遍历后是否是递增的序列,代码如下

public static void inorder(TreeNode root) {

        if(root != null) {

            inorder(root.left);
            System.out.println(root.val);
            inorder(root.right);
        }
    }

    public static void main(String[] args) {

        int[] arr = {0, 9, 4, 2, 6};
        TreeNode root = new TreeNode(arr[0]);

        for(int i = 1; i < arr.length; i++) {

            SortBinaryTree(root, arr[i]);
        }

        inorder(root);
    }

测试结果
这里写图片描述

2、查找结点

将给定值与根结点对比,若小于根结点的值,则与根的左子树比较,若大于根结点的值,则与根的右子树对比,具体代码如下。

public TreeNode find(TreeNode root, int key) {

        TreeNode p = root;

        while(p != null && p .val != key) {

            if(key < p.val) {
                p = p.left;
            } else {
                p = p.right;
            }
        }

        if(p == null) {
            return null;
        }

        return p;
    }

3、插入结点

类似查找,只是需要查找至左子树或者右子树为空的位置进行插入,来看代码

public void insert(TreeNode root, int key) {

        if(root == null) {
            root = new TreeNode(key);
            return;
        }

        TreeNode p = root;
        TreeNode parent = root;
        boolean isLeftChild = true;

        while(p != null) {

            parent = p;
            if(key < p.val) {
                p = p.left;
                isLeftChild = true;
            } else {
                p = p.right;
                isLeftChild = false;
            }
        }

        TreeNode newNode = new TreeNode(key);
        if(isLeftChild) {
            parent.left = newNode;
        } else {
            parent.right = newNode;
        }
    }

posted on 2018-08-23 09:34  的先生在打码  阅读(112)  评论(0编辑  收藏  举报

导航