专项攻克——二叉树

news2024/11/24 22:21:24

文章目录

  • 一、二叉树定义、分类
  • 二、二叉树的存储结构
  • 三、创建二叉树
  • 四、遍历方式

一、二叉树定义、分类

  1. 二叉树:是N个结点的有序集合,该集合或者为空集,或者由一个根节点跟两棵互不相交的、分别称为根节点的左子树或者右子树的二叉树组成。每个结点最多有两个子树。左子树跟右子树是有序的。
  2. 满二叉树:二叉树深度为k (k≥1)时,第k层有2^(k-1)个节点,二叉树总共有 。
  3. 完全二叉树:只有最下面两层有度数小于2的节点,且最下面一层的叶节点集中在最左边的若干位置上。具有n个节点的完全二叉树的深度为: (log2n)+1 或 log2(n+1)

二叉树的特点:

  • 在k层中的最大节点个数为 2^(k-1);
  • 层数为k的树的最大节点个数为 2^k - 1;
  • 叶节点的个数比度数为2的节点的个数要多1个: n0 = n2+1
  • 总节点数为各类节点之和:n=no+n1+n2
  • 总节点数为所有子节点数加一: n= n + 2*n2+ 1 故得: no=n2+1

二、二叉树的存储结构

以二叉链表存储为例
在这里插入图片描述

结构:

public class BinaryNode {
    //左节点
    public BinaryNode left;
    //数据域
    public int data;
    //右节点
    public BinaryNode right;

	public BinaryNode() {
    }
    
    public BinaryNode(int data) {
        this.data = data;
    }
}

三、创建二叉树

思路:相当于插入一系列值到空二叉树中,插入规则为

  1. 当前值如果小于当下节点值:left非空则直接把值放入left,否则把left当成当下节点 继续递归。
  2. 当前值如果大于当下节点值:right非空则直接把值放入right,否则把right当成当下节点 继续递归。
public class BinaryTree<V> {
    //根节点,默认为null
    private BinaryNode root = null;

    /**
     * 描述: 构建二叉树
     * Node:节点,
     * data:待插入的数据
     */
    private void buildBinaryTree(BinaryNode node, int data) {
        if (root == null) {
            root = new BinaryNode(data);
            return;
        }

        //根节点不为空,那么判断数据是否小于当前节点的数据
        if (data < node.data) {
            //如果小于,判断当前节点是否有左叶子节点
            if (node.left == null) {
                //左叶子节点为空,设置左叶子节点,并且设置数据
                node.left = new BinaryNode(data);
            } else {
                //左叶子节点不为空,递归调用构建二叉树的函数
                this.buildBinaryTree(node.left, data);
            }
        } else {
            //如果大于或等于,判断当前节点是否存在右叶子节点
            if (node.right == null) {
                //右叶子节点为空,设置右叶子节点,并且设置数据域
                node.right = new BinaryNode(data);
            } else {
                //右叶子节点点不为空,递归调用构建二叉树的函数
                this.buildBinaryTree(node.right, data);
            }
        }
    }

    /**
     * 前序遍历
     */
    public void preOrder(BinaryNode node) {
        System.out.println(node.data);
        if (node.left != null) {
            this.midOrder(node.left);
        }
        if (node.right != null) {
            this.midOrder(node.right);
        }
    }

    /**
     * 中序遍历
     * */
    public void midOrder(BinaryNode node) {
        if (node.left != null) {
            this.midOrder(node.left);
        }
        System.out.println(node.data);
        if (node.right != null) {
            this.midOrder(node.right);
        }
    }

    /**
     * 后序遍历
     */
    public void afterOrder(BinaryNode node) {
        if (node.left != null) {
            this.midOrder(node.left);
        }
        if (node.right != null) {
            this.midOrder(node.right);
        }
        System.out.println(node.data);
    }

    public static BinaryTree createBinaryTree(int[] datas) {
        BinaryTree binaryTree = new BinaryTree();
        for (int data : datas) {
            binaryTree.buildBinaryTree(binaryTree.root, data);
        }
        return binaryTree;
    }


    /**
     * 描述: 创建二叉树函数
     * int[] 是个int类型的数组
     * 通过循环调用,往二叉树插入数据
     */
    public static void main(String[] arg) {
        int[] datas = new int[]{1, 9, 8, 2, 10};
        //构建二叉树
        BinaryTree binaryTree = createBinaryTree(datas);
        //前序遍历
        System.out.println("前序遍历");
        binaryTree.preOrder(binaryTree.root);
        //中序遍历
        System.out.println("中序遍历");
        binaryTree.midOrder(binaryTree.root);
        //后续遍历
        System.out.println("后序遍历");
        binaryTree.afterOrder(binaryTree.root);
    }
}

四、遍历方式

总结:通过看父节点的输出先后顺序,就可以判断是什么遍历方式。

分为三种遍历:

  1. 前序遍历:先输出父节点, 再遍历左子树和右子树。
  2. 中序遍历:先遍历左子树, 再输出父节点, 再遍历右子树。
  3. 后序遍历:先遍历左子树, 再遍历右子树, 最后输出父节点。
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/401707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue项目打包Gzip压缩,IIS发布

什么是gzip、有何用&#xff1f; gzip是GNUzip的缩写&#xff0c;最早用于UNIX系统的文件压缩。HTTP协议上的gzip编码是一种用来改进web应用程序性能的技术&#xff0c;web服务器和客户端&#xff08;浏览器&#xff09;必须共同支持gzip。目前主流的浏览器&#xff0c;Chrome…

18 个重要的 JavaScript 字符串方法

1. trim()它删除了两侧的空白。ECMAScript 2019 中还包含 trimStart() 和 trimStart() 方法。它们与 trim() 相同&#xff0c;但 trimStart() 和 trimEnd() 分别从字符串的开头和结尾删除空格。2. match()match() 方法返回匹配字符串的数组。3. split()split() 方法将字符串转换…

5大GPU厂商共建 | openKylin社区GPU SIG首次例会召开!

3月8日&#xff0c;openKylin社区GPU SIG首次例会以线上形式召开。此次会议由长沙景美集成电路设计有限公司、摩尔线程智能科技&#xff08;北京&#xff09;有限责任公司、格兰菲智能科技有限公司、象帝先计算技术&#xff08;重庆&#xff09;有限公司等GPU厂商的多位SIG Mai…

JavaScript 中的全部对象

宿主对象&#xff08;host Objects&#xff09;&#xff1a;由 JavaScript 宿主环境提供的对象&#xff0c;它们的行为完全由宿主环境决定。 【 浏览器环境宿主&#xff0c;全局对象window&#xff0c;window 上又有很多属性&#xff0c;如 document。 全局对象 window 上的属…

ROS1学习笔记:tf坐标系广播与监听的编程实现(ubuntu20.04)

参考B站古月居ROS入门21讲&#xff1a;tf坐标系广播与监听的编程实现 基于VMware Ubuntu 20.04 Noetic版本的环境 文章目录一、创建功能包二、创建代码2.1 以C为例2.1.1 配置代码编译规则2.1.2 编译整个工作空间2.1.2 配置环境变量2.1.4 执行代码2.2 以Python为例2.2.1 配置代码…

SD卡通信协议那些事

SD卡通信 SD卡通信协议主要包括物理层、数据传输层和应用层三个部分。 物理层&#xff1a;SD卡使用SPI或SDIO两种物理层协议进行通信。SPI是一种同步串行通信协议&#xff0c;使用4根信号线进行通信&#xff1b;SDIO是一种异步串行通信协议&#xff0c;使用9根信号线进行通信…

[ROC-RK3568-PC] [Firefly-Android] 10min带你了解I2C的使用

&#x1f347; 博主主页&#xff1a; 【Systemcall小酒屋】&#x1f347; 博主追寻&#xff1a;热衷于用简单的案例讲述复杂的技术&#xff0c;“假传万卷书&#xff0c;真传一案例”&#xff0c;这是林群院士说过的一句话&#xff0c;另外“成就是最好的老师”&#xff0c;技术…

做了个springboot接口参数解密的工具,我给它命名为万能钥匙(已上传maven中央仓库,附详细使用说明)

前言&#xff1a;之前工作中做过两个功能&#xff0c;就是之前写的这两篇博客&#xff0c;最近几天有个想法&#xff0c;给它做成一个springboot的start启动器&#xff0c;直接引入依赖&#xff0c;写好配置就能用了 springboot使用自定义注解实现接口参数解密&#xff0c;普通…

什么是UEFI签名认证?UEFI签名有什么好处?

为了防御恶意软件攻击&#xff0c;目前市面上所有电脑设备启动时默认开启安全启动(Secure Boot)模式。安全启动(Secure Boot)是UEFI扩展协议定义的安全标准&#xff0c;可以确保设备只使用OEM厂商信任的软件启动。UEFI签名认证就是对运行在 UEFI 系统下的 efi 驱动和通过 UEFI …

IT行业就业趋势显示:二季度平均月薪超8千

我国的IT互联网行业在近些年来规模迅速扩大&#xff0c;技能和技术水平也明显提升&#xff0c;目前IT互联网行业已经成为社会发展中新型产业的重要组成部分&#xff0c;行业的人才队伍也在不断的发展壮大&#xff0c;选择进入入互联网行业工作的人也越来越多。 根据58同城前段…

arcgispro3.1(账号登陆)

ArcGIS Pro 3.1 更新中文概览专注于 制图、GIS、Python前言&#xff1a;本次更新给了我两个惊喜&#xff0c;一个是本来 ArcMap 就有的功能&#xff0c;另一个明显是学习的 QGIS&#xff0c;嘿嘿&#xff0c;大家往下看吧。整理翻译了一下官方的 ArcGIS Pro 3.1 新特性更新概览…

远程桌面瘦客户机的优点和缺点

微软为 Windows 配备了本地远程桌面客户端&#xff0c;以通过远程桌面协议会话访问虚拟桌面环境或集中式服务器。但是&#xff0c;Windows 远程桌面客户端并不是唯一选项。另一个流行的选择是远程桌面瘦客户机。 一、什么是瘦客户机 瘦客户机是一种无硬盘的台式计算机&#x…

基数排序算法

目录&#xff1a;什么是基数排序&#xff1f;基本原理核心思想实现逻辑代码实现复杂度分析总结什么是基数排序&#xff1f; 基数排序&#xff1a;基数排序&#xff08;Radix sort&#xff09;是一种非比较型整数排序算法&#xff0c; 基本思想主要是通过关键字间的比较和移动记…

苹果笔不用原装可以吗?Apple Pencil平替笔推荐

近些年来&#xff0c;不管是学习还是画画&#xff0c;都有不少人喜欢用ipad。而ipad的用户&#xff0c;也是比较重视它的实用价值&#xff0c;尤其是不少人都想要好好利用来进行学习记笔记。事实上&#xff0c;有很多替代品都能替代Apple Pencil&#xff0c;仅仅用于记笔记就没…

Linux信号详解

文章目录Linux信号什么是信号**从生活角度理解: **技术应用角度的信号进程的注意事项信号概念用kill -l命令可以察看系统定义的信号列表信号处理常见方式概览信号产生通过终端按键产生信号使用signal函数自定义SIGINT信号的处理方式使用sigprocmask函数阻塞2号信号和40号信号vo…

Kafka 消息不丢失

Kafka 消息不丢失生产者丢失消费者丢失不丢失配置Kafka 保证消息不丢失&#xff1a;只对已提交的消息 (committed message) 做有限度的持久化保证 已提交的消息&#xff1a;当 n 个 Broker 成功接收到该消息并写入到日志文件后&#xff0c;就告诉生产者该消息已成功提交有限度…

Android 动态调用SD卡内jar包

背景&#xff1a;jar包不放在项目路径&#xff0c;而是放在SD卡目录内&#xff0c;需要动态调用jar包内函数实现自己的业务逻辑。全部流程新建一个项目用来打包jar。打包jar定义接口&#xff0c;规范函数定义实现类&#xff0c;实现方法&#xff0c;并实现函数的业务逻辑&#…

大数据 | (一)Hadoop伪分布式安装

大数据原理与应用教材链接&#xff1a;大数据技术原理与应用电子课件-林子雨编著 Hadoop伪分布式安装借鉴文章&#xff1a;Hadoop伪分布式安装-比课本详细 大数据 | &#xff08;二&#xff09;SSH连接报错Permission denied&#xff1a;SSH连接报错Permission denied 哈喽&a…

社科院与杜兰大学金融管理硕士项目——人生没有太晚的开始,不要过早的放弃

经常听到有人问&#xff0c;“我都快40了&#xff0c;现在学车晚不晚呢”“现在考研晚不晚&#xff1f;”“学画画晚不晚&#xff1f;”提出这些疑问的人&#xff0c;往往存在拖延&#xff0c;想法只停留在想的阶段&#xff0c;从来不去行动。当看到周边行动起来的人开始享受成…

JAVA JDBC连接mysql数据库

什么是驱动&#xff1f;驱动是指计算机系统中的一种软件程序&#xff0c;它用于控制硬件设备的操作。每个硬件设备都需要与操作系统进行通信&#xff0c;而操作系统需要知道如何与每个设备进行通信&#xff0c;这就是驱动程序的作用。什么是jdbc&#xff1f;JDBC 是 Java 数据库…