目录

1.树的基本概念

1.1重要概念

2.二叉树的基本概念

2.2二叉树的基本概念:

2.2二叉树的存储:

2.3二叉树的遍历:(遍历思路和子问题思路)

前序遍历:根--》左--》右

中序遍历;   左 --》根--》右

后序遍历: 左--》右--》根

2.4  二叉树的基本操作

(1)获取树中节点的个数:

(2)获取叶子节点的个数:

(3)获取第k层节点的个数

(4)获取二叉树的高度: 高度:左右树最大的深度

(5)查找 val 所在结点

(6)判断一棵树是不是完全二叉树 :非递归方式(用·队列完成)


1.树的基本概念

一种非线性数据结构,由N(N>=0)个有限节点组成一个具有层次关系的集合,具有以下特点:

  1. 根节点,没有前驱结点
  2. 除根节点外,其余节点被分成M(M > 0)个互不相交的集合T1、T2、......、Tm,
  3. 每棵子树的根节点只有一个前驱,但可以有0个或多个后驱
  4. 树是递归的

1.1重要概念

  1. 节点的度:一个节点含有的子树的个数称为该节点的度;
  2. 树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6
  3. 叶子节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I...等节点
  4. 双亲节点或父节点:若一个节点含有子节点, 如上图:A是B的父节点
  5. 孩子节点或子节点:一个节点含有的子树的根节点; 如上图:B是A的孩子节点
  6. 根结点:一棵树中,没有双亲结点的结点;如上图:A
  7. 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
  8. 树的深度:树中节点的最大层次; 如上图:Q的深度是4
  9. 树的高度:最大深度才是树的高度

树的表现形式:最常用的孩子兄弟表示法。

class Node {int value; // 树中存储的数据Node firstChild; // 第一个孩子引用Node nextBrother; // 下一个兄弟引用
}

树的应用:文件系统管理

注意!!!树形结构之间,子树不能相交


2.二叉树的基本概念

一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。 每个子树都是二叉树
二叉树的特点:
1. 每个结点最多两棵子树,即二叉树不存在度大于 2 的结点。
2. 二叉树的子树有左右之分,其子树的次序不能颠倒,因此二叉树是有序树。

二叉树的基本形态:

 特殊的二叉树:

1. 满二叉树: 一个二叉树,如果每一个层的结点数都达到最大值2,   如果一个二叉树的层数为K,且结点总数是 ,则它就是满二叉树。
2. 完全二叉树: 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。

(a)满二叉树                       (b)完全二叉树                    (c)不完全二叉树

注意:满二叉树是一种特殊的完全二叉树。

2.2二叉树的基本概念:

1. 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1)(i>0)个结点
2. 若规定只有根节点的二叉树的深度为1,则深度为K的二叉树的最大结点数是2^k-1(k>=0)
3. 对任何一棵二叉树, 如果其叶结点个数为 n0, 度为2的非叶结点个数为 n2,则有n0=n2+1
4. 具有n个结点的完全二叉树的深度k为上取整log2(n+1)
5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的顺序对所有节点从0开始编号,则对于序号为i的结点有:

1)若i>0,双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点

2)若2i+1<n,左孩子序号:2i+1,否则无左孩子

3)若2i+2<n,右孩子序号:2i+2,否则无右孩子

2.2二叉树的存储:

可用顺序存储和链表存储,一般用链式存储

2.3二叉树的遍历:(遍历思路和子问题思路)

前序遍历:根--》左--》右

    //前序遍历:根--》左--》右   无返回值 遍历思路//若有返回值,如:List<Integer> ,则需用其来接受遍历的结果  List<Integer> list= new ArrayList<>()void preOrder(TreeNode root) {if (root == null) {return;}System.out.println(root.val+" "); //打印根节点preOrder(root.left);  //执行递归操作preOrder(),遍历左子树preOrder(root.right);//执行递归操作preOrder(),遍历右子树}//=============================================================////前序遍历:根--》左--》右 --》有返回值--》子问题思路public List<Character> preorderTraversal(TreeNode root) {List<Character> list = new ArrayList<>();if (root == null) {return list;}
//         System.out.println(root.val+" "); //打印根节点list.add(root.val);List<Character> leftTree = preorderTraversal(root.left);list.addAll(leftTree);List<Character> rightTree = preorderTraversal(root.right);list.addAll(rightTree);return list;}

中序遍历;   左 --》根--》右

    //中序遍历:左--》根--》右void midOrder(TreeNode root) {if (root == null) {return;}midOrder(root.left);   //执行递归操作preOrder(),遍历左子树System.out.println(root.val+" ");  //遍历结束打印根midOrder(root.right);//执行递归操作preOrder(),遍历右子树}
//================================================================//public List<Character> midorderTraversal(TreeNode root) {List<Character> list1 = new ArrayList<>();if (root == null) {return list1;}List<Character> leftTree = midorderTraversal(root.left);list1.addAll(leftTree);  //左list1.add(root.val);//根List<Character> rightTree = midorderTraversal(root.right);list1.addAll(rightTree);//右return list1;}

后序遍历: 左--》右--》根

    void postOrder(TreeNode root) {if (root == null) {return;}postOrder(root.left);   //执行递归操作preOrder(),遍历左子树postOrder(root.right);//执行递归操作preOrder(),遍历右子树System.out.println(root.val+" ");  //遍历结束打印根}

二叉搜素树:中序遍历(有序遍历)左树<根<右树

2.4  二叉树的基本操作

(1)获取树中节点的个数:

  //获取树中节点的个数 :遍历思路int count = 0;  //此处变量为成员变量int size(TreeNode root) {
//        int count = 0;  此处定义为局部变量if (root == null) {return 0;}count++;size(root.left);     //执行递归操作preOrder(),遍历左子树size(root.right);//执行递归操作preOrder(),遍历右子树return count;}//获取树中节点的个数 :子问题思路:左节点+右节点int size1(TreeNode root){if (root == null) {return 0;}//执行递归操作return size1(root.left) + size1(root.right) + 1;}

(2)获取叶子节点的个数:

//获取叶子节点的个数::遍历思路--->叶节点:左右树节点为空int leafcount = 0;void getLeafNodeCount(TreeNode root) {if (root == null) {return ;}if (root.left == null && root.right == null) {leafcount++;}//执行递归操作getLeafNodeCount(root.left);getLeafNodeCount(root.right);}//获取叶子节点的个数::子问题思路--->叶节点:左右树节点为空int getLeafNodeCount1(TreeNode root) {if (root == null) {return 0;}if (root.left == null && root.right == null) {return 1; //当前root是叶子节点}//执行递归操作return getLeafNodeCount1(root.left) + getLeafNodeCount1(root.right);}

(3)获取第k层节点的个数

  //获取第k层节点的个数: 子问题思路int getKNodeCount(TreeNode root,int k) {if (root == null || k <= 0 ) {return 0;}if (k == 1) {return 1;}return getKNodeCount(root.left,k-1) + getKNodeCount(root.right,k-1);}

(4)获取二叉树的高度: 高度:左右树最大的深度

    //获取二叉树的高度: 高度:左右树最大的深度   子问题思路:max(左树高度,右树高度)+1(根节点)int getHeight(TreeNode root) {if (root == null) {return 0;}int leftHeight = getHeight(root.left); //首先分别记录左右树的高度,避免后续重复计算,出现超时int rightHeight = getHeight(root.right);return leftHeight > rightHeight ? leftHeight+1 : rightHeight+1;
//        return Math.max(getHeight(root.left),getHeight(root.right))+1;}

(5)查找 val 所在结点

    // 查找 val 所在结点,没有找到返回 null
// 子问题思路: 根 -> 左子树 -> 右子树的顺序进行查找
// 一旦找到,立即返回,不需要继续在其他位置查找TreeNode find(TreeNode root, char val) {if (root == null) return null;if (root.val == val) return root;TreeNode ret = find(root.left, val);if (ret != null) {return ret;}TreeNode ret1 = find(root.right, val);if (ret1 != null) {return ret1;}return null;}

(6)判断一棵树是不是完全二叉树 :非递归方式(用·队列完成)

// 判断一棵树是不是完全二叉树 :非递归方式(用·队列完成)//root不为空,将左右节点放入队列,然后弹出一个节点给cur//继续放下一个节点的左右树,继续弹出,当弹出值为null时,看队列是否全是null//队列元素全是null,则是完全二叉树boolean isCompleteTree(TreeNode root) {if (root == null) return true;Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {  //队列不为空执行TreeNode cur = queue.poll();if (cur != null) {queue.offer(cur.left);queue.offer(cur.right);}else {break;}}while (!queue.isEmpty()) {TreeNode top = queue.peek();if (top != null) {return false;}queue.poll();}return true;}

【JAVA】数据结构——二叉树的学习相关推荐

  1. Java数据结构与算法学习 目前30170字

    文章借鉴于[尚硅谷]数据结构与算法(Java数据结构与算法),在内容方面会做更改,但是核心依然是他们的学习视频.在这里声明. 1. 线性结构和非线性结构 1.1 线性结构 数据结构包括两大部分,一个叫 ...

  2. Java数据结构——二叉树的遍历

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

  3. java数据结构二叉树遍历_java数据结构 之 二叉树的遍历(1)

    树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合 节点:上图的圆圈,比如A,B,C等都是表示 ...

  4. JAVA数据结构二叉树高度计算

    目录 二叉树结点类 二叉树类 采用先序遍历求二叉树高的算法int height()方法 二叉树结点类 public class BinaryNode<T> {public T data;p ...

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

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

  6. 二叉树 BinaryTree (先序、中序、后序遍历 节点查找、插入、删除 完整类) Java数据结构与算法

    二叉树 BinaryTree (先序.中序.后序遍历 节点查找.插入.删除 完整类) Java数据结构与算法 源代码: view plain /** * * @author sunnyykn */ i ...

  7. Java毕业设计_数据结构课程在线学习辅导系统

    数据结构课程在线学习辅导系统 数据结构课程在线学习辅导系统mysql数据库创建语句 数据结构课程在线学习辅导系统oracle数据库创建语句 数据结构课程在线学习辅导系统sqlserver数据库创建语句 ...

  8. java中的数据结构之HashMap学习

    java中的数据结构之HashMap学习 equal与hashcode equals与hashcode的源码 为什么hashmap中作为键值的类要重写hashcode和equals方法 Integer ...

  9. java 跳表_数据结构跳表学习并用Java实现

    前面学习很多类的源码过程中,底层基本都是数组和链表,今天学习第三种结构跳表(SkipList). 跳表解决的问题 一个有序的数组如果我们要判断一个数据是否存在可以通过二分查找法非常快速的判断出来,但是 ...

  10. 【Java数据结构】链式存储的二叉树

    链式存储的二叉树 二叉树数据结构 创建二叉树 二叉树的遍历 先序遍历 中序遍历 后序遍历 二叉树节点的查找 先序查找 中序查找 后序查找 删除二叉树的子树 二叉树示例完整代码 BinaryTree 类 ...

最新文章

  1. mongoose简单使用
  2. godaddy域名转发(域名跳转)设置教程
  3. 多人合作开发的标准制定
  4. druid监控配置及sql注入防火墙配置
  5. Diango博客--12.开发 Django 博客文章阅读量统计功能
  6. 数据采集组件:Flume基础用法和Kafka集成
  7. 结巴分词关键词相似度_jieba+gensim 实现相似度
  8. Leetcode每日一题:1356.sort-integers-by-the-number-of-1-bits(根据二进制1的个数排序)
  9. 结构体在固件库中的应用
  10. emq数据储存到mysql,规则引擎示例 - 保存数据到 MySQL - 《EMQ X Enterprise v4.0 中文文档》 - 书栈网 · BookStack...
  11. 学生学籍管理系统页面源代码html_学生信息管理系统系统源代码
  12. as400 编程语言c,AS400_RPG入门
  13. 计算机包括台式机和笔记本,外星人Area-51M游戏笔记本评测:比台式机更强悍的笔记本...
  14. 微信小程序访问外部链接
  15. ES6笔记上(深入浅出ES6—阮一峰)
  16. Franz Mandl, Graham Shaw《Quantum Field Theory (2nd)》(弗兰兹·曼德尔, 格雷厄姆·肖《量子场论(第二版)》)中文目录
  17. 如何让我的世界变成别人的世界(国际版)——HMCL启动器之如何同时用到mod和光影
  18. Latex 文本居中
  19. SpaceSyntax【空间句法】之DepthMapX学习:第二篇 输出了什么东西 与 核心概念
  20. kvm 监控内存,替换页表(linux版的win VT晶核)(这个整复杂了,不用小内核也可以实现,留着吧,主要记录了bootLoad的启动过程)

热门文章

  1. ipad mini2降级刷10.3.3系统教程
  2. android 坐标度分秒转换工具,android 经纬度度分秒与十进制之间的相互转换
  3. 基于C++的教师信息管理系统
  4. maya2014中uvlayout2.08安装
  5. 测试工程师如何薪资过万
  6. matlab中用xlsread()函数在Excel中读取数据
  7. 老男孩python全栈3期_Python/Python3视频教程2017老男孩Python全栈工程师3期基础Python3.5...
  8. mysql绿色版安装、局域网访问配置
  9. 测试电脑硬盘损坏的软件,硬盘检测工具哪个好 如何检测硬盘是否损坏【详细介绍】...
  10. windows 10下解压.gz后缀文件