二叉树数据结构详解及java使用二叉树示例代码

二叉树详解:

        二叉树是一种常见的树形数据结构,它由节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。

二叉树组成:

  1. 节点(Node): 每个节点包含三个要素:数据(存储的值)、左子节点指针和右子节点指针。节点之间通过指针连接,形成树的结构。

  2. 根节点(Root): 树的顶部节点称为根节点,是树的起始点,它没有父节点。

  3. 叶子节点(Leaf): 没有子节点的节点称为叶子节点,它们位于树的末端。

  4. 父节点和子节点: 每个节点除了存储数据外,还包含指向其子节点的指针。一个节点可以有零、一个或两个子节点,分别称为左子节点和右子节点。同时,每个节点也有指向其父节点的指针,除了根节点,根节点没有父节点。

  5. 深度(Depth): 从根节点到达某个节点的路径长度称为该节点的深度。根节点的深度为0,其子节点的深度为1,以此类推。

  6. 高度(Height): 树的高度等于根节点的深度。即,树中任意节点的深度最大值即为树的高度。

  7. 二叉搜索树(Binary Search Tree,BST): 二叉搜索树是一种特殊的二叉树,其中左子树上的节点值都小于根节点的值,右子树上的节点值都大于根节点的值。这使得在二叉搜索树中进行搜索、插入和删除操作更加高效。

  8. 遍历(Traversal): 遍历是指按照一定顺序访问树中的所有节点。常见的遍历方式包括前序遍历(Preorder)、中序遍历(Inorder)和后序遍历(Postorder)。

    • 前序遍历: 先访问根节点,然后递归地前序遍历左子树,最后递归地前序遍历右子树。
    • 中序遍历: 先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。中序遍历二叉搜索树会得到一个有序序列。
    • 后序遍历: 先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。
  9. 平衡二叉树(Balanced Binary Tree): 平衡二叉树是一种特殊的二叉树,其任意节点的两棵子树的高度差不超过1。这保证了树的高度较低,使得插入、删除和搜索等操作的时间复杂度较低,提高了性能。

结构图:

Java代码示例

        演示了如何定义一个二叉树节点类(BinaryTreeNode)和一个二叉树类(BinaryTree),以及如何插入节点并进行中序遍历:

// 二叉树节点类
class BinaryTreeNode {
    int key;
    BinaryTreeNode left, right;

    public BinaryTreeNode(int item) {
        key = item;
        left = right = null;
    }
}

// 二叉树类
class BinaryTree {
    BinaryTreeNode root;

    BinaryTree() {
        root = null;
    }

    // 插入节点
    void insert(int key) {
        root = insertRec(root, key);
    }

    BinaryTreeNode insertRec(BinaryTreeNode root, int key) {
        if (root == null) {
            root = new BinaryTreeNode(key);
            return root;
        }
        if (key < root.key)
            root.left = insertRec(root.left, key);
        else if (key > root.key)
            root.right = insertRec(root.right, key);
        return root;
    }

    // 中序遍历
    void inorderTraversal(BinaryTreeNode root) {
        if (root != null) {
            inorderTraversal(root.left);
            System.out.print(root.key + " ");
            inorderTraversal(root.right);
        }
    }

    public static void main(String[] args) {
        BinaryTree tree = new BinaryTree();
        int[] keys = {15, 10, 20, 8, 12, 17, 25};

        for (int key : keys) {
            tree.insert(key);
        }

        System.out.print("中序遍历:");
        tree.inorderTraversal(tree.root);
    }
}

        二叉树是一种非常重要的数据结构,在计算机科学领域有着广泛的应用,如搜索算法、排序算法、图形图像处理等。理解二叉树的结构和特性对于编程和算法设计至关重要。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【AI学习】RAG与推荐系统

一、《双塔模型的瓶颈究竟在哪&#xff1f;》 文章介绍了谷歌的一篇论文&#xff0c;《Large Dual Encoders Are Generalizable Retrievers》 文章主要在讲&#xff0c;稠密检索模型在OOD&#xff08;Out-Of-Distribution&#xff0c;即域外&#xff09;泛化能力不行&#xff…

【Pytorch】(十五)模型部署:ONNX和ONNX Runtime

文章目录 &#xff08;十五&#xff09;模型部署&#xff1a;ONNX和ONNX RuntimeONNX 和 ONNX Runtime的关系将PyTorch模型导出为ONNX格式使用Netron可视化ONNX模型图检查ONNX模型验证ONNX Runtime推理结果使用ONNX Runtime运行超分模型 &#xff08;十五&#xff09;模型部署&…

外贸干货|真正的销售高手,都很会提问

你的产品性价比很高&#xff0c;为什么客户没有买单呢&#xff1f; 最重要的原因是你没有了解到他真正的需求。 真正的销售高手&#xff0c;应该是一个提问高手&#xff0c;至少要连续问对方6个问题&#xff0c;问出客户的真实需求。 假如他回答你的问题&#xff0c;你有一种&a…

git 冲突与解决冲突

目录 1.使用 git 解决冲突 GIT 常用命令 制造冲突 解决冲突 2.使用 IDEA 解决冲突 产生冲突 解决冲突 1.使用 git 解决冲突 GIT 常用命令 命令作用git clone克隆git init初始化git add 文件名添加到暂存区git commit -m " 日志信息" 文件名提交到本地库git st…

【运维自动化-配置平台】如何通过模板创建集群和模块

通过【每天掌握一个功能点】配置平台如何创建业务机拓扑&#xff08;集群-模块&#xff09;我们知道了直接创建集群和模块的操作方法&#xff0c;直接创建的方式适合各集群模块都相对独立的场景&#xff0c;那大量的、标准规范的集群模块如何快速创建呢&#xff0c;这里就引入了…

条件生成对抗网络(cGAN)在AI去衣技术中的应用探索

随着深度学习技术的飞速发展&#xff0c;生成对抗网络&#xff08;GAN&#xff09;作为其中的一个重要分支&#xff0c;在图像生成、图像修复等领域展现出了强大的能力。其中&#xff0c;条件生成对抗网络&#xff08;cGAN&#xff09;通过引入条件变量来控制生成模型的输出&am…

面试十五 容器

一、vector容器 template<typename T> class Allocator{ public:T* allocator(size_t size){// 负责内存开辟return (T*)malloc(sizeof(T) * size);}void deallocate(void * p){free(p);}void construct(T*p,const T&val){// 定位newnew (p) T(val);}void destroy(…

Golang对接Ldap(保姆级教程:概念搭建实战)

Golang对接Ldap&#xff08;保姆级教程&#xff1a;概念&搭建&实战&#xff09; 最近项目需要对接客户的LDAP服务&#xff0c;于是趁机好好了解了一下。LDAP实际是一个协议&#xff0c;对应的实现&#xff0c;大家可以理解为一个轻量级数据库。用户查询。比如&#xff…

DiT论文精读Scalable Diffusion Models with Transformers CVPR2023

Scalable Diffusion Models with Transformers CVPR2023 Abstract idea 将UNet架构用Transformer代替。并且分析其可扩展性。 并且实验证明通过增加transformer的宽度和深度&#xff0c;有效降低FID 我们最大的DiT-XL/2模型在classconditional ImageNet 512、512和256、256基…

switch语句深讲

一。功能 1.选择&#xff0c;由case N:完成 2.switch语句本身没有分支功能&#xff0c;分支功能由break完成 二。注意 1.switch语句如果不加break&#xff0c;在一次判断成功后会执行下面全部语句并跳过判断 2.switch的参数必须是整形或者是计算结果为整形的表达式,浮点数会…

centos 7 yum install -y nagios

centos 7 systemctl disable firewalld --now vi /etc/selinux/config SELINUXdisabled yum install -y epel-release httpd nagios yum install -y httpd nagios systemctl enable httpd --now systemctl enable nagios --now 浏览器 IP/nagios 用户名&#xff1a;…

stack,queue的模拟实现以及优先级队列

这篇博客用来记录stack&#xff0c;queue的学习。 stack的模拟实现 stack的模拟实现比较简单&#xff0c;先上代码 #pragma once #include<vector> #include<list> #include<deque> #include<iostream> using std::deque; using namespace std;name…

【STM32HAL库】外部中断

目录 一、中断简介 二、NVIC 1.寄存器 2.工作原理 3.优先级 4.使用NVIC 三、EXTI 1.简介 2.AFIO&#xff1a;复用功能IO&#xff0c;主要用于重映射和外部中断映射配置​编辑 3. 中断使用 4.HAL库配置使用 一、中断简介 中断的意义&#xff1a;高效处理紧急程序&#xff0c;不会…

树莓派学习笔记--串口通信(配置硬件串口进行通信)

树莓派串口知识点 树莓派4b的外设一共包含两个串口&#xff1a;硬件串口&#xff08;/dev/ttyAMA0&#xff09;,mini串口&#xff08;/dev/ttyS0&#xff09; 硬件串口由硬件实现&#xff0c;有单独的波特率时钟源&#xff0c;性能高&#xff0c;可靠&#xff1b;而mini串口性能…

Java-AQS的原理

文章目录 基本概述1. 设计思想2. 基本实现 一些关键词语以及常用术语&#xff0c;主要如下&#xff1a; 信号量(Semaphore): 是在多线程环境下使用的一种设施&#xff0c;是可以用来保证两个或多个关键代码段不被并发调用&#xff0c;也是作系统用来解决并发中的互斥和同步问题…

数据挖掘 | Count数据去除批次效应后不是整数甚至还出现负值导致无法进行差异分析怎么办?

之前咱们介绍过数据挖掘 | 批次效应的鉴定与处理 | 附完整代码 注释 | 看完不会来揍我&#xff0c;但是很多小伙伴遇到了Count数据批次处理后不是整数甚至还出现负值的问题&#xff0c;这就导致无法使用某些包包进行差异分析&#xff08;对差异分析感兴趣的小伙伴可以查看&…

MySQL中如何随机获取一条记录

点击上方蓝字关注我 随机获取一条记录是在数据库查询中常见的需求&#xff0c;特别在需要展示随机内容或者随机推荐的场景下。在 MySQL 中&#xff0c;有多种方法可以实现随机获取一条记录&#xff0c;每种方法都有其适用的情况和性能特点。在本文中&#xff0c;我们将探讨几种…

word添加行号

打开页面设置&#xff0c;找到行号

2018-2023年上市公司富时罗素ESG评分数据

2018-2023年上市公司富时罗素ESG评分数据 1、时间&#xff1a;2018-2023年 2、来源&#xff1a;整理自WIND 3、指标&#xff1a;证券代码、简称、ESG评分 4、范围&#xff1a;上市公司 5、指标解释&#xff1a; 富时罗素将公司绿色收入的界定和计算作为公司ESG 评级打分结…

「白嫖」开源的后果就是供应链攻击么?| 编码人声

「编码人声」是由「RTE开发者社区」策划的一档播客节目&#xff0c;关注行业发展变革、开发者职涯发展、技术突破以及创业创新&#xff0c;由开发者来分享开发者眼中的工作与生活。 面对网络安全威胁日益严重的今天&#xff0c;软件供应链安全已经成为开发者领域无法避免的焦点…