数据结构-BST树(1)-入门,遍历,节点添加

本文介绍了BST树(二分搜索树)的基本概念,包括其性质和结构。通过Java代码详细阐述了如何手写一个BST树,包括节点定义、元素添加流程及遍历方法(前中后序)。同时,文章探讨了遍历过程的优化,以及非递归实现遍历的思路和方法。
摘要由CSDN通过智能技术生成

1.什么是BST树

Bst树又名二分搜索树,binary search tree,它是遵循一定规律的二叉树;

  • 1.二分搜索树是二叉树;
  • 2.二分搜索树每个节点的值:
    a.大于其左子树所有节点的值;
    b.小于其右子树所有节点的值;
  • 3.每一棵子树也是二分搜索树;

如图:

就是说每往一个根节点添加元素时,左孩子要比根节点小,右孩子要比根节点大,不允许元素重复(可选项);

2.手写一个基本的BST树

下面开始用java写一个Bst树,主要分为几步:

  • 基本节点
  • add元素流程
  • query元素流程 //todo
  • 遍历(先中后序)
  • 删除元素 //todo

另外补充下:为何说是"基本的",因为还存在可优化的情况,但是不揉在一起,先把最基本的怼出来,下一小节再来考虑优化问题(基本流程,递归);

2.1.定义基本节点

定义好左孩子右孩子,根节点;

public class BinarySearchTree<T extends Comparable> {
   

    Node root;
    int size;

    class Node {
   

        Node left;
        Node right;
        T value = null;

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

    }
    
}

2.2.add元素流程

1.如果root为空则直接new一个,并将值添加给该节点;
2.如果不为空,则将值添加进节点,根据之前描述的二分搜索树的特性,左孩子比根小,右孩子比根大,那么就涉及对比(这里用的java泛型+比较器的方式),那么就需要另开一个函数接受一个Node和新传进来的值进行对比,就是下面代码的私有方法nodeadd()

public class BinarySearchTree<T extends Comparable> {
   

    ......

    class Node {
   
        ......
    }
    
    public void add(T value) {
   

        if (root == null) {
   
            root = new Node(value);//1
            size++;
            return;
        } else {
   
            nodeAdd(root, value);//2
        }

    }
    
    /**
     * @param currNode 当前根节点
     * @param newValue 新插入元素
     */
    /**
     * 二分搜索树每个节点的值:
     * a.大于其左子树所有节点的值;
     * b.小于其右子树所有节点的值;
     */
    private void nodeAdd(Node currRoot, T newValue) {
   

        //无重复元素
        if (currRoot.value.compareTo(newValue) == 0) {
   
            return;
        }

        //compareTo 前一个元素和后一个元素比较--返回整数,1,0,-1;返回1表示大于,返回-1表示小于,返回0表示相等;
        if (currRoot.value.compareTo(newValue) > 0) {
   //左插

            //当前根节点大于插入值,且当前根节点的左子树为空,所以该值应该插入左子树
            if (currRoot.left == null) {
   
                currRoot.left = new Node(newValue);
                size++;
                return;
            } else {
   
                //当前根节点大于插入值,且当前根节点的左子树不为空,则递归到一次的左子树查询当中去
                nodeAdd(currRoot.left, newValue);//递归
            }
        } else if (currRoot.value.compareTo(newValue) < 0) {
   //右插

            //右插同理左插
            if (currRoot.right == null) {
   
                currRoot.right = new Node(newValue);
                size++
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值