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

帆软 finereport FCRA 考试 题库+答案,共收录561题,大部分有答案 帆软 finereport FCRA 考试 题库+答案,共收录561题,大部分有答案 入门基础 11.多选题 以下方式中属于FineReport中预览模式的有( ) 分页预览、填报预览、新填报预览、数据分析、移动端预览 16.判断题 FineReport报表工具必须购买激活码后才能使用。 错误,可以免费获取激活码。 29.单选题 FineReport是一款利用( )语言开发的报表工具。java 41.多选题 访问帮助文档的方式有哪些?设计器中社区菜单下-帮助文档;直接访问http://help.finere 阅读详情

树

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

二叉树

二叉树基本特点

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

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

斜树

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

满二叉树

  • 假设一个二叉树的深度为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;
    }



汇川EASY系列之以太网通讯(套接字socket做从站) 汇川EASY系列的以太网通讯中的Socket字通讯,不能使用配置的方式实现,只能通过指令完成,本文将详细说明 阅读详情

相关推荐

超聚变安装银河麒麟服务器系统ky10-server-x86

超聚变-通过BMC口进服务器管理界面如下图为BMC管理口:默认BMC口IP:https://192.168.2.100l浏览器打开网页,输入用户名和密码登陆后,如下图红框处,选择“启动虚拟控制台”——选择“HTML集成远程控制台”系统银河麒麟服务器系统ky10 server x86选择镜像文件X86架构我们一般选择下图2212版本选择启动方式:光驱重启出现安装图形化界面选装安装系统的磁盘系统安装盘选完后如下图,会置灰创建root密码开始安装系统首次进入,有协议界面。

zengliguang的专栏 5961

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

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

2302_79787471的博客 501

如何利用URDF文件表示并联结构(仅适用于支持SDF格式的仿真环境)

介绍了一种使用URDF文件在Gazebo中表示并联结构的方法,该方法使用了URDF的SDF拓展。在一个具有并联结构的双足机器人上应用并演示了此方法的有效性。

RobotFreak的博客 3848

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

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

Beyond94的博客 429

SUMO仿真教程(1) ——安装环境的设置(Windows 10系统)

SUMO安装环境的设置 目录一.SUMO下载的官方网址二.下载步骤:三.环境设置:1.打开设置环境变量的界面2.用户(Administrator)变量设置3.系统变量设置四.总述 一.SUMO下载的官方网址 sumo的下载地址: 二.下载步骤: 1.以sumo1.8.0为示例进行演示,点击下载地址; 2.选择Windows64位的安装版本,如下图所示: 3.点击对应版本会跳转到如下图所示的界面,等待几秒后会自动下载(温馨提示:请将下载路径提前设置好): 4.到目标存储路径下查看下载完成的SUMO(本

weixin_50632459的博客 1万+

纯相位全息图优化算法综述

除此之外,还有许多用于减少斑点噪声的非迭代方法,例如:采用下采样掩膜的采样纯相位全息图(Sampled-Phase-only Hologram)方法、模式化相位掩膜(Patterned Phase-Only Hologram)方法、双相位方法(Double-Phase Method),以及使用非随机相位掩膜的方法(Random Phase-Free Method)等。迭代算法通常由一个对目标全息图的近似出发,经过一系列的重复操作不断优化这个近似全息图,直到该近似所得到的重建图像满足一定的误差要求;

ZhongKeWeiXing的博客 1427

二叉树的广度优先搜索(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

消费级显卡跑大模型:RTX 3060 12G 部署 70 亿参数 AI 编程助手的优化实战

本文详细介绍了如何在消费级显卡RTX 3060 12G上,通过量化、投机解码和分页KV-Cache等核心优化技术,成功部署并流畅运行70亿参数的CodeLlama-7B编程助手。文章提供了从环境配置、模型准备到参数调优的完整实战笔记,实测显存占用降至7.3GB,生成速度达21.7 token/秒,为开发者和技术爱好者提供了可行的本地AI部署方案。

weixin_29053067的博客 1257

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

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

阿鹏的博客 667

多边形裁剪算法

多边形裁剪算法 刚参加工作就跟多边形刚上了,对于多边形的裁剪做一些简单的总结。 多边形裁剪主要有四种算法 Greiner-Hormann裁剪算法 Sutherland-Hodgman算法 Vatti裁剪算法 Weiler-Atherton裁剪算法 作为一名想要成为优秀算法工程师的程序员,我们不能只会使用,而不知道其原理,倘若如此,我们无法做到应用于本身业务上的定制化的修改。 Greiner–H...

papalqi 6729

QGis软件 —— 9、QGis - 由点绘制热力图来模拟人流量(绘制点方式、excel导入数据方式)

QGis软件 —— 9、QGis - 由点绘制热力图来模拟人流量(绘制点方式、excel导入数据方式)

1470

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

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

m0_56911284的博客 3086

【KingSCADA】如何创建新应用

KingSCADA3.8集成开发环境是基于工程的应用管理模式,实现了对多个应用的集中开发和管理的功能,一个工程可以同时管理多个应用,即在KingSCADA3.8工程设计器中可以同时对多个应用进行开发,应用之间可以实现相互复制、粘贴等功能,大大提高了开发效率。(此处感觉和VS类似)使用KingSCADA3.8开发的系统称为应用,一个完整的应用一般包含以下部分或全部内容:IO设备、IO采集点、图形界面、动画链接、趋势曲线、报警和事件、历史记录、数据库、Web Server等部分。

做有价值的事,积累有价值的笔记! 3107

第13章 Java集合与数据结构

第13章 集合与数据结构

xqmids99的博客 1177

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

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

weixin_29214715的博客 263

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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、付费专栏及课程。

余额充值