Java二叉查找树的实现以及与散列表的对比

二叉查找树

二叉查找树(Binary Search Tree)也叫排序树或有序树或搜索树,它是为实现快速查找而生。二叉查找树的左子树的节点都小于它的父节点,右子树中的节点都大于它的父节点,因此若按中序遍历则要进行从小到大的排序。
无论是空树,二叉查找树,都有严格的定义:
若左子树不空,则左树上所有节点的值均小于它的根节点的值;若右子树不空,则右树上所有节点的值均小于它的根节点的值;左、右树也分别为二叉查找树,没有键值相等的节点。
二叉树查找的时间复杂度最坏的情况下类似链表为O(n),而在一般平衡状态下一般都会接近O(logn),从时间复杂度来看是一种比较出色的查找的数据结构。而在插入操作中由于只能插入在叶子上也类似查找的时间复杂度。但是二叉查找树在删除时要分为三种情况:
在这里插入图片描述

1、被删除结点没有子结点:直接将其父结点对应的左子树或右子树设置为 null。如删除结点 E 时,pp.left = null 或 pp.right = null。
2、被删除结点只有一个子结点:直接将其父结点指向被删除结点的左子树或右子树。如删除结点 D 时,pp.left = p.left 或 pp.right = p.right。
3、被删除结点有两个子结点:此时删除比较复杂,需要先从被删除结点的右子树查找最小值结点 p2 赋值给被删除结点。这样就变成删除这个右子树查找最小值结点 p2 的问题,同第一种情况完全一样。如删除结点 B 时,需要在其右子树中查找一个最小的值结点 F,将 B 对应结点的值替换成 F,然后再删除 F。

二叉查找树的时间复杂度都和树的高度息息相关,也就是 O(height)。如果满足平衡二叉树时树高度为 logn,如果退化成链表时树高度为 n,而深度(高度)为k的二叉树至多有2^k-1个结点。

用Java实现二叉树的顺序存储

实现要点:
1、对于完全二叉树,若从上往下,从左到右,则编号为i的结点,其左孩子编号必定为2i,其右边孩子编号必定为2i+1,其双亲结点编号必定为i/2.
2、第i层有2^(k-1)个结点(k为深度)
3、对于任何一棵二叉树,若2度的结点数有n2个,则叶子树n0必定为n2+1(即n0=n2+1)
实现代码:
初始化定义深度长度以及存储数组

import java.util.Scanner;


public class BinaryTree {
   
    final private int DEFAULT_PEEK=6;//创建使用final防止继承
    private int deep;//采用private作为访问控制修饰符
    private int length;
    private String[] array;

构造无参构造器,传入深度参数的构造器,以及传入参数深度和根结点的构造器。

    /**
     * 无参构造器
     */
    public BinaryTree() {
   
        this.deep=DEFAULT_PEEK;//定义deep为设定好的"6"
        this.length=(int)(Math.pow(2,deep)-1);//设定节点数
        array=new String[length];//存储节点数在array中
    }
    /**
     * 传入深度参数的构造器
     */
    public BinaryTree(int deep) {
   
        this.deep=deep;
        this.length=(int)(Math.pow(2,deep)-1);
        array=new String[length];
    }
    /**
     * 传入参数深度和根结点的构造器
     */
    public BinaryTree(int deep,String data) {
   
        this.deep=deep;
        this.length=(int)(Math.pow(2
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值