二叉搜索树

1.需求分析:在n个动态的整数中搜索某个整数?

解决的方案:

1.1动态数组:平均时间复杂度为O(n);

1.2维护一个有序的动态数组,使用二分搜索最坏时间复杂度为O(log n),添加与删除的时间复杂度为O(n);

1.3使用二分搜索树,最坏的时间复杂度为O(log n)

2.二分搜索树的特点及优点

2.1特点:任意一个节点值小于所有右子树节点的值,大于所有左子树节点的值

                存储的元素必须具有比较性(如果是自定义类型,需要指定比较的方式)

2.2优点:可以大大提高搜索数据的效率

3.接口实现

int size();//元素数量

boolean isEmpty(); //是否为空

void clear(); //清空所有元素

void add(); //添加元素

void delete();//删除元素

void contain();//是否包含元素

注意:此处的二叉树并未使用索引;

原因:因为二叉搜索树添加元素的顺序与节点的位置无关,并不适合用索引

4.添加元素

首先判断根节点是否为空,如果不为空,先添加根节点;

根节点不为空时添加元素,首先要找到添加位置的根节点,并且判断添加元素与根节点的大小,创建新节点,如果大于,则添加到右子树的节点上;反之则添加到左子树的节点上;

size++;

public void add(int element){
//       elementIsnull(element);
       if(root==null){
           root=new Node(element,null);
           size++;
           return;
       }
       Node node=root;
       Node newParent=root;//记录父亲节点
       int state=0;//记录一下元素与结点的比较结果;0代表元素大于节点值。1代表相反结果
       while (node!=null){
           newParent=node;
           if(element>node.element){
               node=node.right;
               state=0;
           }else if(element<node.element){
               node=node.left;
               state=1;
           }else {
               node.element=element;
               return;
           }
       }
       Node newNode=new Node(element,newParent);
       if(state==0){
           newParent.right=newNode;
       }else {
           newParent.left=newNode;
       }
        size++;
    }

5.二叉树的前序遍历 (注意所有二叉树)

遍历顺序:遍历根节点——前序遍历左子树节点——前序遍历右子树节点(递归实现)

public void preorderTraversal(Node root){
        if(root==null){
            return;
        }
//        首先遍历根节点
        System.out.println(root.element);
//        其次前序遍历左子树
        preorderTraversal(root.left);
//        最后前序遍历右子树
        preorderTraversal(root.right);
    }

遍历结果:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值