算法其实很简单—二叉排序树的构建

目录

 

1.什么是二叉排序树

2.构建二叉排序树的思路

3.代码实现

4.待办


1.什么是二叉排序树

二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是数据结构中的一类。在一般情况下,查询效率比链表结构要高。

二叉排序树特点:

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3)左、右子树也分别为二叉排序树;

(4)没有键值相等的结点。

简单说,就是每个父节点大于当前节点的左子节点,小于当前节点的右子节点。

2.构建二叉排序树的思路

以下讲解将一个数组转为二叉排序树的思路:

  1. 添加子节点的时候,如果二叉树的root节点为null,则该节点为root节点
  2. 如果root节点不为null,进行以下步骤
  3. 如果子节点(即新增节点)的值小于该节点(第一次为root节点,后续为当前节点),分两种情况:          

          3.1 如果该节点的左子节点为null,则将新增节点做为当前节点的左子节点           

          3.2 如果该节点的左子节点不为null,则将当前节点的左子节点作为父节点,重复 2-3-4步骤

    4. 如果子节点的值不小于该节点的值,分两种情况:

           4.1、如果该节点的右子节点为null,则将新增节点作为当前节点的右子节点

          4.2、如果该节点的右子节点不为null,则将当前节点的右子节点作为父节点,重复 2-3-4步骤

具体实现可参考以下代码

3.代码实现

/**
 * @author 浪子傑
 * @version 1.0
 * @date 2020/5/31
 */
public class BinarySearchTreeDemo {

    public static void main(String[] args) {
        BinarySearchTree binarySearchTree = new BinarySearchTree();
        int[] arr = {7, 3, 10, 12, 5, 1, 9};
        for (int i : arr) {
            Node node = new Node(i);
            binarySearchTree.add(node);
        }
        binarySearchTree.infixOrder();
    }
}

class BinarySearchTree {

    private Node root;

    /**
     * 添加子节点
     *
     * @param node
     */
    public void add(Node node) {
        if (root == null) {
            root = node;
        } else {
            root.add(node);
        }
    }

    /**
     * 中序遍历
     */
    public void infixOrder() {
        if (root != null) {
            root.middleOrder();
        } else {
            System.out.println("当前root为空");
        }
    }
}

class Node {

    private int value;
    private Node left;
    private Node right;

    public Node(int value) {
        this.value = value;
    }

    /**
     * 添加节点
     *
     * @param node
     */
    public void add(Node node) {
        // 如果该节点为null,直接返回
        if (node == null) {
            return;
        }
        // add的节点小于当前节点,说明应该在当前节点的左边
        // 否则放在当前节点的右边
        if (node.value < this.value) {
            // 如果当前节点的左边没有子节点,则直接把add节点放在当前节点的左子节点
            // 否则的话,遍历当前左子节点,直到找到合适位置
            if (this.left == null) {
                this.left = node;
            } else {
                this.left.add(node);
            }
        } else {
            if (this.right == null) {
                this.right = node;
            } else {
                this.right.add(node);
            }
        }
    }

    /**
     * 中序遍历
     */
    public void middleOrder() {
        if (this.left != null) {
            this.left.middleOrder();
        }
        System.out.println(this);
        if (this.right != null) {
            this.right.middleOrder();
        }
    }

    @Override
    public String toString() {
        return "Node{" +
                "value=" + value +
                '}';
    }
}

4.待办

1、二叉排序树的节点删除

2、二叉排序树的优化,即平衡二叉树

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值