【数据结构进阶】二叉平衡树

一、 二叉平衡树

概念

二叉搜索树有称 二叉排序树,它也可以是一个空树。

  • 如果它的左子树不为空,则左子树上所有结点的值都小于根结点的值
  • 如果他的右子树不为空,则右子树上所有结点的值都大于根结点的值
  • 它的左右子树也分别是二叉搜索树
    在这里插入图片描述

由图可以看出:二叉搜索树中最左侧的节点是树中最小的节点,最右侧节点一定是树中最大的节点

在这里插入图片描述

采用中序遍历遍历二叉搜索树,可以得到一个有序的序列:

1 3 4 5 6 7 8 9 10

二叉搜索树的查找

若根结点不为空:
	如果根结点的值==target值 返回true
	如果根结点的值 > target值 在其左子树查找
	如果根结点的值 < target值 在其右子树查找
否则 返回false	

二叉树查询效率【性能分析】

最优情况:二叉搜索树为完全二叉树,其平均比较次数 在这里插入图片描述

最差情况:二叉搜索树退化成单支树,其平均比较次数在这里插入图片描述

二、 AVL树【高度平衡的二叉搜索树】

概念

二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。

当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过
1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。

下面说一下二叉搜索树的特点:

  • 它的左子树右子树都是AVL树。
  • 左右子树高度之差的绝对值不超过 1

在这里插入图片描述

如果一颗二叉搜索树是高度平衡的,他就是AVL树。它有n个结点,其高度可保持在 O(log2N),搜索时间复杂度O( log2N)

AVL树结点的定义

为了AVL树实现简单,AVL树节点在定义时维护一个平衡因子,具体节点定义如下:
在这里插入图片描述

static class TreeNode {
   
   
        public int val;
        public int bf; //平衡因子
        public TreeNode left;
        public TreeNode right;
        public TreeNode parent;

        public TreeNode(int val) {
   
   
            this.val = val;
        }
    }

AVL树的插入

public TreeNode root;

    public boolean insert(int val) {
   
   
        TreeNode node = new TreeNode(val);
        if (root == null) {
   
   
            root = node;
            return true;
        }
        TreeNode parent = null;
        TreeNode cur = root
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙宇航的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值