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

二叉树

二叉树基本特点

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

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

斜树

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

满二叉树

  • 假设一个二叉树的深度为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();//取出头元素添加至listres.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;}

Java数据结构之二叉树及其源码实现相关推荐

  1. 【Java 数据结构】二叉树的遍历和基本操作

    一.树型结构 1.概念 2.树的表示形式 二.二叉树 1.特点 2.两种特殊的二叉树 3.二叉树的性质 选择题: 4.二叉树的存储 5.二叉树的基本操作 5.1.创建一棵二叉树 5.2.二叉树的遍历 ...

  2. Java数据结构——认识二叉树

    作者:敲代码の流川枫 博客主页:流川枫的博客 专栏:和我一起学java 语录:Stay hungry stay foolish 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器--牛客 ...

  3. java数据结构编写二叉树_java 数据结构与算法 BinaryTree二叉树编写

    import java.util.Stack; public class BinaryTree { TreeNode root = null; public BinaryTree() { this.r ...

  4. 【Java数据结构】二叉树的前中后序遍历(递归和非递归)

    二叉树的遍历 递归做法 前序遍历 中序遍历 后序遍历 非递归 前序遍历 中序遍历 后序遍历 二叉树遍历是二叉树的一种重要操作 必须要掌握 二叉树的遍历可以用递归和非递归两种做法来实现 递归做法 前序遍 ...

  5. java数据结构15_二叉树和红黑二叉树

    l 二叉树的定义 二叉树是树形结构的一个重要类型. 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重 ...

  6. java数据结构之二叉树的定义和递归实现

    定义 最多有两棵子树的有序树,称为二叉树.二叉树是一种特殊的树. 递归定义:二叉树是n(n>=0)个有限结点构成的集合.N=0称为空二叉树:n>0的二叉树由一个根结点和两互不相交的,分别称 ...

  7. Java数据结构——排序二叉树

    排序二叉树概念 二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树.是数据结构中的一类. 对于二叉排序树的任何一个非叶子节点, 要求 ...

  8. Java 数据结构之二叉树

    第1关:二叉树的实现之前序遍历 本关任务:完成用二叉链表存储的二叉树的前序遍历算法. package step1;/*** Created by zengpeng on 2018/2/9.*/ pub ...

  9. 头歌JAVA数据结构答案

    头歌JAVA数据结构答案 一.Java数据结构-循环链表的设计与实现 第1关 单循环链表的实现-链表的添加.遍历 package step1; /*** Created by sykus on 201 ...

最新文章

  1. 如何在单页应用程序Angular 7中使用FastReport Core Web报表
  2. 近世代数--多项式环--未定元的存在性
  3. 转载:由图片SEO想起
  4. C++多态面试题汇总
  5. 关于iBatis中的错误提示(必须以 或 /结尾,有时并不是你的结尾没有以 /结束,而是这个标签里面有问题!!)(更重要的是sqlMap的修改手段!!!)
  6. Dropping water balloons
  7. 2022吴恩达机器学习课程学习笔记(第二课第一周)
  8. 新东方 词根词缀 excel_背单词 | 新东方的杨鹏老师用什么方法?
  9. java http 401_401 API请求状态错误
  10. 【随记】Dialog dismiss无法正常关闭问题
  11. [Rotation Transform] 旋转变换
  12. 密码学数学基础——群、环、域
  13. 基于GMapping的栅格地图的构建
  14. 【Router】PC连接到路由LAN,但是无法获取到IP地址问题分析及解决方案
  15. 三分钟,我让搞后端的学弟爱上了Eolink
  16. 专访万岁游戏 CEO 姚堃:探索 VR 游戏开发演进之路
  17. mysql删除表主键约束_MySQL添加约束
  18. 计算机软件基础第二版p,《计算机软件基础(二)》
  19. t3畅捷通显示不能登陆服务器,用友T3提示不能登录到服务器:解析服务端数据出现错误,可能服务端是8.13的先前版本?...
  20. MySQL性能优化(七):其它优化

热门文章

  1. 134个治病小偏方,从此不用去医院 - 生活至上,美容至尚!
  2. 最近知识的总结与复习
  3. 罗斯蒙特1056ph电极_Rosemount/罗斯蒙特1056-02-20-36-AN-UL 分析仪PH电极
  4. IDES翻译—采购流程中的Enjoy界面
  5. iOS支付指南:POS终端刷卡流程、银联55域TLV子域信息说明、银联前置、NFC
  6. 对不可能之事持一种健康的漠视
  7. 吴雪筠校友报告会 --职场仪表—心态—自强之道
  8. 杭州中高级职称评审流程
  9. android复读机功能,点滴复读机最新版-点滴复读机app下载v3.0.1 安卓版-腾牛安卓网...
  10. QST青软实训学员学习总结-2020/4/22-ZigBee