目录

4.1.树

4.2.二叉树

4.2.1.概述

4.2.3.存储结构

4.2.3.遍历

1.逻辑简介

2.代码示例


4.1.树

树,由n(n≥0)个有限节点和边组成一个具有层次关系的数据结构。树需要满足以下条件:

  • 任何结点的子节点不相交。
  • 任何子结点只有一个父节点。
  • N个结点,N-1条边。

对于一个非空树(结点数≥0),具有以下性质:

  • 起始结点称为“根”
  • 除根结点外可分为m个互不相交的有限集合,其中每个集合本身也是一棵树,称为原来这棵树的“子树”。

树的基本术语:

  • 结点的度:节点的子树个数
  • 树的度:树的所有结点中最大的度数
  • 叶结点:度为0的结点
  • 父结点:有子树的结点都是它的子树的根结点
  • 子结点:若A是B的父结点,则B是A的子节点
  • 兄弟结点:具有同一父结点的结点彼此是

4.2.二叉树

4.2.1.概述

二叉树是一种每个结点的度不大于2的树,由根结点和左子树、右子树组成,具有以下五种姿态:

除了五种基本姿态外,还有三种比较特殊的姿态:

4.2.3.存储结构

二叉树可以用两种结构存储,一种是链表,一种是数组。

数组表示的话第一个位置存储的根结点,挨着根结点的是根结点的左右孩子,接下来是根结点左孩子的左右孩子,右孩子的左右孩子,以此类推:

数组仅适合完全二叉树(完美二叉树是特殊的完全二叉树),以为当表示非完全而二叉树,会出现大面积内存空间浪费的情况:

4.2.3.遍历

1.逻辑简介

二叉的遍历,本质上是二维结构的线性化,二叉树本来是非线性的,但是其结果最后是线性的。

二叉树的遍历根据访问当前子树的根结点的顺序分为四种:

  • 先序遍历
  • 中序遍历
  • 后序遍历

除此之外还有一种特殊的遍历,层序遍历,按照每一层来遍历。

层序遍历需要用到一个队列来实现:

首先是根结点入队,然后访问根结点,根结点左右孩子顺序入队,根结点出队,然后队列中的后续结点重复上述的出队入队流程,直到队列为空,整个层序遍历过程就结束。

2.代码示例

二树的结点:

public class Node {//数据域private int data;//指针域private Node left;private Node right;//遍历标志private boolean isOrder;{isOrder=false;}public Node(){}public Node(int data){this.data=data;}public int getData() {return data;}public void setData(int data) {this.data = data;}public Node getLeft() {return left;}public void setLeft(Node left) {this.left = left;}public Node getRight() {return right;}public void setRight(Node right) {this.right = right;}public boolean isOrder() {return isOrder;}public void setOrder(boolean order) {isOrder = order;}
}

各种遍历的实现:

public class BinaryTree {//判断BT是否为空public static boolean isEmpty(Node root){//判断操作return  root==null?true:false;}//先序建树public static Node create(Node node,Scanner scanner){Integer data=Integer.parseInt(scanner.next());if(data!=-1){node=new Node();node.setData(data);node.setLeft(create(node,scanner));node.setRight(create(node,scanner));}//以防万一,如果节点为叶节点时,将其左右指针置空if(data==-1){node.setLeft(null);node.setRight(null);}return node;}//递归先序遍历二叉树public static void pre(Node node){//需要给节点增加一个遍历状态标志位//每次递归回溯时需要判断当前节点的标志位是否为已遍历状态//否则会徘徊在叶节点,堆栈溢出if(node!=null&!node.isOrder()){System.out.println(node.getData());node.setOrder(true);pre(node.getLeft());pre(node.getRight());}}//中序遍历public static  void mid(Node node){if(node!=null&!node.isOrder()){node.setOrder(true);mid(node.getLeft());System.out.println(node.getData());mid(node.getRight());}}//后续遍历public static void post(Node node){if(node!=null&!node.isOrder()){node.setOrder(true);mid(node.getLeft());mid(node.getRight());System.out.println(node.getData());}}//层序遍历public static void level(){//递归法if (!queue.isEmpty()) {//取出队首元素Node node = queue.exit();//打印节点数据System.out.println(node.getData());//左孩子入队queue.Enter(node.getLeft());//右孩子入队queue.Enter(node.getRight());level();}//循环法/*while (!queue.isEmpty()) {//取出队首元素Node node = queue.exit();//打印节点数据System.out.println(node.getData());//左孩子入队queue.Enter(node.getLeft());//右孩子入队queue.Enter(node.getRight());}*/}
}

需要注意的是,层序遍历的话要用到一个队列来实现,这个队列的话用的就是之前在线性结构里实现的那个队列:

public class queue {private static Node[] que;//头指针private static int first;//尾指针private static int last;//初始化static{que=new Node[100];first=0;last=-1;}//入队public static void Enter(Node node){que[++last]=node;}//出队public static Node exit(){Node node=que[first++];return node;}//判空public static boolean isEmpty(){return (que[first]==null&&first==last) ? true:false;}
}

数据结构(4)树形结构——二叉树(概述、前序、中序、后序、层序遍历JAVA实现)相关推荐

  1. java中二叉树_Java工程师面试1000题224-递归非递归实现二叉树前、中、后序遍历...

    224.使用递归和非递归实现二叉树的前.中.后序遍历 使用递归来实现二叉树的前.中.后序遍历比较简单,直接给出代码,我们重点讨论非递归的实现. class Node { public int valu ...

  2. C++实现二叉树 前、中、后序遍历(递归与非递归)非递归实现过程最简洁版本

    本文并非我所写,是复制的该链接中的内容: 最近学习二叉树,想编程实现递归和非递归的实现方式: 递归的方式就不说了,因为大家的递归程序都一样:但是对于非递归的实现方式, 根据这几天的查阅资料已看到差不多 ...

  3. java数据结构学习笔记-二叉树前、中、后序遍历

    public class BinaryTreeDemo {public static void main(String args[]){Employee emp1= new Employee(1,&q ...

  4. 【LeetCode | 二叉树前、中、后序遍历{迭代法}实现】

    1.前序遍历 // 解题思路:利用栈的原理实现以迭代方法来前序遍历(根左右)二叉树 class Solution { public:vector<int> preorderTraversa ...

  5. 【LeetCode | 二叉树前、中、后序遍历{递归法}实现】

    1.前序遍历 #include <iostream> #include <vector> #include <queue> #include <algorit ...

  6. 二叉树的前、中、后、层序遍历整理(Java版本)

    源自快手电商一面 package cn.com.codingce.树.遍历;import cn.com.codingce.树.TreeNode;import java.util.ArrayList; ...

  7. 二叉树前、中、后序线索化及遍历

    public class ThreadedBinaryTree {public static void main(String[] args){Heronodes node1=new Heronode ...

  8. Python数据结构之树形结构——数组存储

    Python数据结构之树形结构--数组存储 树:一种非线性结构,主要使用链表来存储,也可以使用数组存储. 本代码使用两种数组 元素数组:0,6,3,5,4,7,8,9,2 由于 0 索引不存储元素,所 ...

  9. 【二叉树Java】二叉树遍历前序中序后序遍历的非递归写法

    本文主要介绍二叉树前序中序后序遍历的非递归写法 在探讨如何写出二叉树的前序中序后序遍历代码之前,我们先来明确一个问题,前序中序后序遍历根据什么区分? 二叉树的前序中序后序遍历,是相较根节点说的.最先遍 ...

最新文章

  1. (十一)boost库之多线程间通信
  2. item 24: 区分右值引用和universal引用
  3. C# DataGridView属性设置
  4. 开源贡献 计算_学生如何开始为开源软件做贡献
  5. html引用单文件组件,webpack入坑之旅(五)加载vue单文件组件_html/css_WEB-ITnose
  6. ReactiveCocoa 5.0 初窥:可能是最痛的一次升级
  7. [f]class获取元素函数
  8. win10系统matlab不能卸载不了,win10系统matlab打不开无法运行的方案
  9. java:文本框的简单使用
  10. 云集网上各种解决win10锁屏壁纸不能播放幻灯片的方法
  11. 市场营销学3——市场营销环境
  12. 中国交通标志牌数据集TT1OOK中的类别ID及其图标罗列以及含义详细介绍
  13. php 短信验证 云之讯,python3.7实现云之讯、聚合短信平台的短信发送功能
  14. 专科入行软件测试可行么
  15. 外部PLC触发VisionMaster多流程运行
  16. C++应用程序列表(来自Bjarne Stroustrup)
  17. 去公司刚开发怎么启动项目
  18. Ubuntu 20安装 Qt5.9
  19. 百度AI应用方案:健康饮食APP
  20. 基于istio架构下的路径重定向

热门文章

  1. 实习生两大杀手之一:Maven 我们为什么要使用 Maven
  2. html表格左上角单元格添加2条斜线的方法
  3. CSDN的护眼模式开启历程(csdn夜间模式)
  4. Nginx支持HTTPS,生成SSL证书
  5. 换脸已不算事儿 能换整个身体的AI伪造技术马上就来了!
  6. 朱敏:40岁创业如何成就绝代明星?(六)
  7. 《Photoshop图像合成专业技法(修订版)》—第1章1.4节精修头发
  8. 网课查题公众号怎么搭建制作怎么弄
  9. linux创建目录并修改目录权限
  10. Centos7.9部署sd-webui,容易上手易学就会