Java数据结构之二叉树及其源码实现

用 ABAP LSMW 的 Standard Batch / Direct Input 稳准快迁移物料主数据:从 MM01 录制到 RMDATIND 直入的落地指南 本文详细介绍了SAP数据迁移中LSMW工具的使用方法,重点分析了物料主数据迁移的两种主要路径:Batch Input Recording和Standard Batch/Direct Input。前者通过录制事务操作实现快速起步,后者通过调用预置接口程序实现稳定高效的批量处理。文章深入解析了Standard Direct Input的具体实施步骤,包括对象属性设置、源结构定义、字段映射规则等关键环节,并特别强调了迁移前的准备工作(如编号策略、视图策略等)对项目成功的重要性。通过对比两种方法的优缺点,为不同业务 阅读详情

树

我们的数据结构包含一对一、一对多、多对多的存储关系。
我们常用的一对一的数据结构:数组以及链表;一对多的数据结构:树;多对多:图。
本文主要介绍树的常用结构 二叉树。

二叉树

二叉树基本特点

  • 至多拥有一个根节点
  • 每个结点最多只能拥有两个子节点
  • 每个节点的任意两个左右子树分别为二叉树

二叉树又包含三种特殊形态:斜树、满二叉树、完全二叉树

斜树

  • 当二叉树的所有的结点都只有左子树的二叉树叫做左斜树;
  • 当二叉树的所有的结点都只有右子树的二叉树叫做右斜树;

满二叉树

  • 假设一个二叉树的深度为N,在这N层中,每一层的结点都达到最大值,即为满二叉树
  • 满二叉树的结点个数满足2^n-1;

完全二叉树

  • 假设一个二叉树的深度为N,在N-1层中,每层的结点都达到了最大值,且第N层中,所有的结点都位于最左侧且连续,则称为完全二叉树

代码实现

//二叉树

class JZ26TreeNode{

    int val;//本结点存储数据
    JZ26TreeNode left;//存储左子树地址
    JZ26TreeNode right;//存储右子树地址

    //构造方法 传入结点值
    public JZ26TreeNode(int x){
        this.val = x;
    }

}

生成二叉树

public class JZ26 {
    public static void main(String[] args) {
        //二叉树 根节点
        JZ26TreeNode root = new JZ26TreeNode(3);
        //根节点左子树
        JZ26TreeNode left01 = new JZ26TreeNode(9);
        //根结点右子树
        JZ26TreeNode right01 = new JZ26TreeNode(20);
        //将根节点左右子树分别与根节点相关联
        root.left = left01;
        root.right = right01;
        
        //根节点右子树的左子树
        JZ26TreeNode right01Left  = new JZ26TreeNode(15);
        //根节点右子树的右子树
        JZ26TreeNode right01Right =  new JZ26TreeNode(7);
   
        //给根节点右子树分别关联
        right01.left = right01Left;
        right01.right = right01Right;
    }
}

大家应该脑补出上图的二叉树了 ,这里我给大家画了一下

在这里插入图片描述

打印二叉树(广度优先遍历)

查看了网上的多种打印方式 ,都是要借助容器来实现的,先存储后打印,采取队列应该是最方便一种方式 ,队列先进先出

//借助queue打印二叉树
    public static void main(String[] args) {
        //二叉树 根节点
        JZ26TreeNode root = new JZ26TreeNode(3);
        //根节点左子树
        JZ26TreeNode left01 = new JZ26TreeNode(9);
        //根结点右子树
        JZ26TreeNode right01 = new JZ26TreeNode(20);
        //将根节点左右子树分别与根节点相关联
        root.left = left01;
        root.right = right01;

        //根节点右子树的左子树
        JZ26TreeNode right01Left  = new JZ26TreeNode(15);
        //根节点右子树的右子树
        JZ26TreeNode right01Right =  new JZ26TreeNode(7);

        //给根节点右子树分别赋值
        right01.left = right01Left;
        right01.right = right01Right;

        binaryTree(root);

    }

//打印二叉树 广度优先遍历
    public static void binaryTree(JZ26TreeNode root){
        //生成队列 将根节点存储至队列
        Queue<JZ26TreeNode> queue = new LinkedList();
        queue.add(root);
        //queue为空 跳出循环
        while (!queue.isEmpty()){
            JZ26TreeNode poll = queue.poll();
            //队列头部元素取出 打印
            System.out.println("二叉树元素为 :"+poll.val);
            //将头部元素的左右结点分别添加至队列 (非空情况)
            if(poll.left!=null) queue.add(poll.left);
            if(poll.right!=null) queue.add(poll.right);
        }
    }

打印结果为:

在这里插入图片描述

算法题

基本二叉树生成了 这里我们来做一道二叉树的算法题 ; (leetcode 剑指offer 第32题)

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回:

[3,9,20,15,7]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

聪明的同学已经发现了 这道题的二叉树就是上面我们已经实现的。 下面我们开始编码。

/*
先说一下思路 题目要求每层从上至下 从左到右顺序存储元素。
根据二叉树的存储规则 我们只能从根节点开始,每次拿到结点的左右结点(非空情况)
但是拿到的左右结点也有可能分别有子左右结点。故采取队列协助打印。
题目要求返回int[]  
上面我们已经学会打印了 那么这道题把打印变成存储int[] 即可。

*/  
    public static void main(String[] args) {
        //二叉树 根节点
        JZ26TreeNode root = new JZ26TreeNode(3);
        //根节点左子树
        JZ26TreeNode left01 = new JZ26TreeNode(9);
        //根结点右子树
        JZ26TreeNode right01 = new JZ26TreeNode(20);
        //将根节点左右子树分别与根节点相关联
        root.left = left01;
        root.right = right01;

        //根节点右子树的左子树
        JZ26TreeNode right01Left  = new JZ26TreeNode(15);
        //根节点右子树的右子树
        JZ26TreeNode right01Right =  new JZ26TreeNode(7);

        //给根节点右子树分别赋值
        right01.left = right01Left;
        right01.right = right01Right;

        int[] ints = binaryTree(root);
        for(int i: ints){
            System.out.println("数组元素为:"+i);
        }

    }

    public static int[] binaryTree(JZ26TreeNode root){
        //生成队列 将根节点存储至队列
        Queue<JZ26TreeNode> queue = new LinkedList();
        queue.add(root);
        List<Integer> res = new ArrayList<>();
        //queue为空 跳出循环
        while (!queue.isEmpty()){
            JZ26TreeNode poll = queue.poll();
            //取出头元素添加至list
            res.add(poll.val);

            //将头部元素的左右结点分别添加至队列 (非空情况)
            if(poll.left!=null) queue.add(poll.left);
            if(poll.right!=null) queue.add(poll.right);
        }
        int[] tar = new int[res.size()];
        //循环列表添加至数组
        for (int i = 0; i < res.size(); i++) {
            tar[i] = res.get(i);
        }
        return tar;
    }



uniapp - 微信小程序接入官方人脸识别认证详细流程及示例源码,Uniapp微信小程序项目集成官方提供的人脸识别身份验证插件接口(多种示例:人脸核验、身份证件与人脸是否匹配、是否活体、实名认证等) uni-app微信小程序人脸识别认证,使用uniapp开发微信小程序的人脸采集功能/人脸识别功能,uniapp vue3微信小程序活体人脸识别,Uni-app微信小程序实名认证,uniApp微信小程序人脸认证,UniApp的微信小程序实名认证与人脸识别系统开发,人脸核身微信小程序uni-app接入流程,wx.startFacialRecognitionVerify,uniapp开发微信小程序-人脸采集功能、微信人脸识别实名认证集成指南,识别失败,人脸识别接口怎么调用,前后端完整示例代码demo,人脸检测功能 阅读详情

相关推荐

Coding Plan:程序员真实工作的可执行编码决策框架

Coding Plan 是一种面向工程实践的编码决策方法论,它超越传统学习路径,聚焦于代码在真实业务系统中的上下文对齐、影响控制与可演进性保障。其核心在于将模糊的开发直觉转化为可度量、可验证、可协作的日常动作,涵盖目标对齐、上下文锁定、验证闭环、协作契约和演进预留五大锚点。结合2026年AI辅助编码新范式,它强调将大模型作为‘上下文翻译器’而非代码生成器,并通过分钟级工作块、技术债主动发行、可观测性前置等机制,显著提升交付确定性与系统长期健康度。本文详解该框架的底层逻辑与落地实践。

weixin_33326218的博客 438

二叉树(数据结构与算法java代码)

可与前序遍历,后序遍历的迭代法实现格式统一。

2302_79787471的博客 501

Android13 SurfaceFlinger启动流程分析

在Android13版本中,SurfaceFlinger是由Android.bp去启动init.rc文件,然后再解析文件去加载SurfaceFlinger。上面方法主要处理如下:1、调用surfaceflinger的createSurfaceFlinger方法,实例化surfaceflinger。2、调用flinger(surfaceflinger)的init()方法,在客户端连接之前进行初始化。

liuning1985622的博客 1919

Java实现二叉树的深度优先遍历

基本思路: 二叉树的深度优先遍历(中序遍历)需要一个栈用于遍历,一个列表用于记录访问过的节点 1.将根节点压入栈中 2.1栈顶元素有左子节点且其左子节点不在列表当中,将其左子节点压入栈中 2.2.1如果栈顶元素没有左子节点或其左子节点在列表中,弹出栈顶元素并访问(还要将其加入到列表中)。 2.2.2如果弹出的节点有右子节点,将其右子节点压入栈 3.如果栈不为空,执行2 如上图所示,则采用当前...

Beyond94的博客 429

CUBEMX ADC 单/多通道+DMA

本文使用的是STM3F103C8T6 Cubemx进行单/多通道DMA配置。

记录学习 1403

Apollo MPC横纵向耦合控制学习笔记

Apollo MPC横纵向控制原理学习笔记

weixin_39199083的博客 1万+

二叉树的广度优先搜索(BFS)和深度优先搜索(DFS)代码实现(Java)

本文的代码和图表来源于力扣(LeetCode) 作者:sdwwld 链接:https://leetcode-cn.com/problems/er-cha-shu-de-jing-xiang-lcof/solution/4chong-jie-jue-fang-shi-bfsdfszhong-xu-bian-li-di-/ 1 二叉树的广度优先搜索(BFS) 代码实现: public static void treeBFS(TreeNode root) { //如果为空直接返回 i

代码之美 833

UE5实现物体高亮描边效果(含UE相关源码浅析)

UE5实现物体高亮描边效果

专注GIS开发 7334

Java实现一棵二叉树的构建以及其深度优先遍历算法

Java实现二叉树 树这个数据结构在平时的实际开发中其实十分常见,例如,要表示级联关系时,通常使用树来表达。 例如,生活中的家族族谱关系,组织架构之间的关系,系统菜单中的级联关系,省市区的一对多关系,业务数据的父子关系等,可见,掌握树的基本数据结构以及如何去应用他,对我们平时的开发是十分有利的。 树的定义 树是 n 个节点的有限集,这里n>=0。当n=0时,称之为一棵空树。 树的特点 有且仅有一个特定的称为根的节点。 当n>1时,其余的节点可分为 m 个互不相交的有限集,每一个集合本身又是

阿鹏的博客 667

orchestrator常见问题汇总

默认的取集群名称的规则为参数决定 ,默认为取主实例 主机名 ,然后按分隔符"."之前的第一段字符为集群别名,这样在集群主库宕机后,新提升的从库的服务器名称为了新的集群名,宕机的主库成为单独的一个集群。1 默认配置文件中设置了匹配规则 ,只有被匹配的主机名才能进行故障恢复,所以该参数需要设置为 "*"3 另外配置文件中还有许多发现,恢复的忽略规则(Ignore) 这些参数也是需要注意的。由于LVS的后端的RS为IP地址,如果直接显示主机名,LVS的接口方法将无法工作。只传入脚本中用到的参数,不要多传入。

DBA之路的博客 829

lvgl 9虚拟键盘控件 (lv_keyboard) 使用指南

是 LittlevGL 提供的一个虚拟键盘控件,适用于在图形界面中输入文本。与按钮矩阵类似,虚拟键盘预定义了多个键位布局,支持多种模式和自定义键位映射,能够满足各种文本输入需求。通过与文本区域 (Text Area) 的结合,键盘能够自动将输入的字符传送到指定区域。控件是 LittlevGL 提供的强大虚拟键盘解决方案,适用于任何需要文本输入的界面。通过预定义的键盘模式、自定义键位映射和文本区域自动填充功能,可以大大提升用户输入体验。无论是在嵌入式系统的用户界面中,还是在其他需要虚拟键盘的应用中,

m0_62599305的博客 2185

数据结构(二叉树)——Java实现

认识二叉树,并用Java实现其一系列的操作。

m0_56911284的博客 3086

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

第13章 Java集合与数据结构

第13章 集合与数据结构

xqmids99的博客 1177

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

modbus数据 java解析_Java教程,java进阶TerrMap数据结构及源码解析

Java教程,想学习Java的小伙伴必看的教程之一。TreeMap是Java集合体系的一员,它可以保存键值对的元素,并且可以依靠底层的红黑树对键进行去重并排序。学习TreeMap的原理,不仅可以在正确的场景应用集合,还可以提高对数据结构的认识和对Java的底层设计的理解。java进阶TerrMap数据结构及源码解析​yun.itheima.com课程亮点包含TreeMap所涉及到的数据结构包含Tr...

weixin_29214715的博客 263

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java集合框架-导学

JDK中封装的操作集合的工具类。

hkdgxyj的博客 115

20172325 2017-2018-2 《程序设计与数据结构》实验二报告

20172325 2017-2018-2 《程序设计与数据结构》实验二报告 课程:《程序设计与数据结构》 班级: 1723 姓名: 邓煜坤 学号:20172325 实验教师:王志强 实验日期:2018年11月11日 必修/选修: 必修 1.实验内容 实验一:实现二叉树 参考教材p212,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preo...

weixin_30851409的博客 135

Java基础复习笔记 第14章:数据结构与集合源码

【代码】Java基础复习笔记 第14章:数据结构与集合源码。

2302_80888278的博客 420

数据结构与算法总结

(一) 数据结构 列举java的集合以及集合之间的继承关系: 容器类介绍以及之间的区别(Java容器主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections)) List,Set,Map的区别:List能插入重复对象,可插入多个Null元素;Set不允许有重复对象,能有一个Null元素,set是无序的,但TreeSet 能进行排序;Map是一个接口,并不是collection的子接口或实现类,ke.

风和先行的专栏 296

Java中的数据结构与集合源码

数据结构,就是一种程序设计优化的方法论,研究数据的`逻辑结构`和`物理结构`以及它们之间相互关系,并对这种结构定义相应的`运算`,目的是加快程序的执行速度、减少内存占用的空间。

m0_72047169的博客 1406

java实现四叉树(附带源码)

java实现四叉树(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1528

数据结构二叉树的Java实现

本篇博文用java实现了数据结构中的二叉树 源码分享在github:数据结构,当然你也可以从下面的代码片中获取 1.二叉树节点类 BiTreeNode.java package code.tree; public class BiTreeNode { public Object data;//节点的数据域 public BiTreeNode lChild,rChild;//左右孩...

baidu_41860619的博客 593

数据结构Java05【二叉树概述、二叉树遍历、堆排序、线索二叉树实现及遍历】

P34-4.7顺序存储的二叉树的概述 P35-4.8顺序存储的二叉树的遍历 P36-4.9常用排序算法之堆排序 P37-4.10线索二叉树的概述 P38-4.11线索二叉树代码实现 1、TestThreadedBinaryTree.java 2、ThreadedBinaryTree.java 3、ThreadedNode.java P39-4.12线索二叉树的遍历

upward 1561

java集合图解源码系列【2】:从二叉树讲到TreeMap,一篇搞明白树的数据结构

大家好!我是未来村村长,就是那个“请你跟我这样做,我就跟你这样做!”的村长👨‍🌾!

农夫的码,没有草原 2015

Java实现二叉树(附带源码)

Java实现二叉树(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1136

数据结构 之 二叉树

一颗二叉树是节点的有限集合,该集合:< 1 >或者为空;< 2 >或者是由一个根节点加上最多两棵分别称为左子树和右子树的二叉树组成。(左右子树可为空)从上图可以看出:< 1 >二叉树不存在度大于2的节点;< 2 >二叉树的子树有左右子树之分,次序不能颠倒,所以二叉树是有序树;

AUGENSTERN_dc的博客 2049

通过Java以及递归算法实现二叉树及其相关操作

通过Java以及递归算法实现二叉树及其相关操作

2301_79698279的博客 1086
上一篇: Java数据结构之双向链表实现
下一篇: 经典算法之二分查找 (Java实现,包含多道经典算法题解)
一个没有梦想的程序员
博客等级 码龄7年 20粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值