当前位置: 首页 > article >正文

数据结构和算法-07平衡二叉树-01

树的发展历程

来认识我们的树结构

image-20240910155138127

image-20240910155429848

平衡二叉树

如果得知二叉树是否平衡,直接的方法是左右子树的高度值不大于1。我们在节点中添加height指标用来检验二叉树的高度差。

规范:如果为空,高度 0。默认产生一个节点高度为: 1

tips: 高度为虚拟高度(类似于层)

添加height属性

定义height属性,默认高度为1,即height=1为根节点。

package com.ffyc.tree.node;

/**
 * 树的节点
 */
public class TreeNode {
    public int val;
    public TreeNode left;
    public TreeNode right;
    public int height;

    public TreeNode() {
    }

    public TreeNode(int val) {
        this.val = val;
        this.height = 1; //默认高度为1
    }

    public TreeNode(int val, TreeNode left, TreeNode right, int height) {
        this.val = val;
        this.left = left;
        this.right = right;
        this.height = height;
    }

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

    @Override
    public String toString() {
        return "TreeNode{" +
                "val=" + val +
                ", left=" + left +
                ", right=" + right +
                ", height=" + height +
                '}';
    }
}

获取height

public int getHeight(TreeNode curr) {
    if (curr == null) return 0;
    return curr.height;
}

更新insert

public TreeNode insert(TreeNode curr, int val) {
    if (curr == null) {
        size++;
        return new TreeNode(val);
    }

    if (val < curr.val) { //比左节点小
        curr.left = insert(curr.left, val);
    } else {
        curr.right = insert(curr.right, val);
    }
    curr.height = 1 + Math.max(getHeight(curr.left), getHeight(curr.right));
    return curr;
}

计算负载因子

public int balanceFactor(TreeNode curr) {
    if (curr == null) return 0;
    return Math.abs(getHeight(curr.left) - getHeight(curr.right));
}

如何判断一棵树是否为BST树

public boolean isBST(TreeNode curr) {
    if (curr == null) return true;
    List<Integer> list = new ArrayList<>();
    inOrder(curr, list);
    for (int i = 1; i < list.size(); i++) {
        if (list.get(i) < list.get(i - 1)) {
            return false;
        }
    }
    return true;
}

中序遍历

private  void inOrder(TreeNode root, List<Integer> list) {
    if (root == null) {
        return;
    }
    //System.out.print(root.val + "\t");
    inOrder(root.left, list);
    list.add(root.val);
    inOrder(root.right, list);
}

测试

int[] arr = {53, 51, 11, 23, 47, 62, 41, 9, 85, 19, 24, 13, 17, 50};
TreeNode  root = new TreeNode(arr[0]);
Bst bst= new Bst();
for(int i=1;i<arr.length;i++){
    root = bst.insert(root,arr[i]);

}
bst.inOrder(root);
new TreePrint<Integer>().print(root);
System.out.println(bst.getHeight(root.left));
System.out.println(bst.balanceFactor(root.left));
System.out.println(bst.isBST(root));

http://www.kler.cn/a/504321.html

相关文章:

  • 我国无人机新增实名登记110.3 万架,累计完成飞行2666万小时
  • [读书日志]8051软核处理器设计实战(基于FPGA)第七篇:8051软核处理器的测试(verilog+C)
  • vim基本命令(vi、工作模式、普通模式、插入模式、可视模式、命令行模式、复制、粘贴、插入、删除、查找、替换)
  • Windows图形界面(GUI)-QT-C/C++ - Qt图形绘制详解
  • 【EI 会议征稿】第四届材料工程与应用力学国际学术会议(ICMEAAE 2025)
  • 探索学习 Python 的有效方式方法
  • 《拉依达的嵌入式\驱动面试宝典》—Linux篇(六)_Linux驱动编程
  • pytest-instafail:让测试失败信息即时反馈
  • 【PyQt】通过load ui来实现菜单栏
  • burpsiute的基础使用(2)
  • 如何通过高防服务隐藏服务器源IP
  • 【docker下载kaggle国外镜像超时】kaggle比赛中时遇到的问题
  • 《深度剖析算法优化:提升效率与精度的秘诀》
  • 在Alpine这小破车里塞进Nginx?
  • 【Spring Boot 应用开发】-04-01 自动配置-数据源-连接池
  • Vue语音播报功能
  • 模拟退火算法在Matlab中的两个应用案例及代码
  • MYSQL5.7 全文检索中文无返回数据
  • MySQL 日志:undo log、redo log、binlog 有什么用?
  • 软件工程和项目管理领域 - CMMI 极简理解
  • 【C#设计模式(23)——模板方法模式(Template Method Pattern)】
  • toJSON使用中遇到的问题
  • c语言 --- 字符串
  • 马氏距离分类器:考虑特征相关性的分类方法
  • vue+element-ui做的前端模糊查询
  • win10安装anaconda环境与opencv