当前位置: 首页 > news >正文

数据结构--------树二叉树

目录

树的概述

树的定义

树的结点

树的特点

二叉树(Binary Tree)

什么是二叉树?

二叉树的分类

满二叉树

完全二叉树

二叉树的存储

顺序存储

链式存储

二叉树的遍历

前序遍历

中序遍历

后序遍历

还原二叉树

层序遍历


树的概述

树是一种非线性的数据结构,存储具有“一对多”关系特点元素的一种数据结构。例如:组织架构、图书目录、商品种类、热点搜索词等。
将具有“一对多”关系的集合中的数据元素按照树的形式进行存储,整个存储形状在逻辑结构上看,类似于实际生活中倒着的树,所以称这种数据的存储结构称为“树”。

树的定义

树(tree)是一种非线性的数据结构,包含 n(n≥0)个结点的有限集合,结点之间具备一对多的逻辑关系,当树的结点n=0时,该树被称为空树。

树的结点

  • 树的结点:树结构中,存储的每一个数据元素都被称为树的“结点”。
  • 根结点:结点1是根结点(root);
  • 子结点:结点2、结点3是根结点的子结点,结点4、结点5是结点2的子结点。
  • 叶子结点:树的末端结点,属于没有子结点的结点,统一被称为叶子结点(leaf)。例如:结点5、结点6、结点7、结点8属于叶子结点。
  • 子树:由某个子结点作为根结点组成的树被称为子树。例如:结点2是根结点1的其中一个子树根结点。

结点的度
对于一个结点,拥有的子树个数(结点有多少分支)称为结点的度(Degree)。
例如:根结点 A 下分出了 3 个子树,所以,结点 A 的度为 3。

树的度
一棵树的度是树内各结点的度的最大值。
例如:各个结点的度的最大值为 3,所以,整棵树的度值是 3。

结点层次
从一棵树的根结点开始,根结点所在层为第一层,根结点的子结点所在层为第二层,依次类推。
例如:A 结点在第一层,B、C、D 为第二层,E、F、G、H、I、J 在第三层,K、L、M 在第四层。

树的高度 
一棵树的高度是树中结点所在的最大层次。树的高度,也被称为树的深度。
例如:树的高度为 4。

树的特点

在任意一个非空树中,有如下特点:

  • 有且仅有一个根结点
  • 一棵树中的任意两个结点,有且仅有唯一的一条路径连通,不存在回路
  • 一棵树如果有 n 个结点,那么它一定有 n-1 条边

二叉树(Binary Tree)

什么是二叉树?

二叉树(Binary tree)是一种结点的度不大于2的有序树,树中包含的各个结点的度不能超过 2,子结点通常被称作“左孩子结点”或“右孩子结点”,子结点的左右次序不能颠倒。二叉树 的分支子树通常被称作“左子树”或“右子树”。

例如:a选项的树是二叉树,b选项的树不是二叉树,因为b选项的树,度为3。

二叉树的分类

满二叉树

满二叉树的定义
满二叉树是一种特殊的二叉树,它的所有非叶子结点都存在左右子结点,并且所有叶子结点都在同一层级。由于满二叉树的每个非叶子结点都符合二叉树的特点,所以也被称为完美二叉树。

满二叉树的特点

  • 一个层数为k的满二叉树,总结点数 = 2k-1。
  • 第i层的结点数 = 2i-1
  • 一个层数为k的满二叉树,叶子结点数 = 2k-1 
  • 具有x个结点的满二叉树,叶子结点数 = (x+1)/2
  • 具有n个结点的满二叉树,深度为 log2(n+1)

例如:该二叉树的总层数为3,总结点数为23-1 = 7,第2层的结点数为22-1 = 2, 叶子结点数为2k-1 = 4。具有7个结点的满二叉树,叶子结点数为(7+1)/2 = 4,深度为log2(7+1) = 3。

完全二叉树

完全二叉树的定义
如果二叉树中,从根结点到倒数第二层,符合满二叉树要求,其叶子结点可以不完全填充,但必须靠从左到右连续分布,这样的二叉树被称为完全二叉树。

完全二叉树:

不是完全二叉树:

完全二叉树特点

  • 满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。

完全二叉树第i层至多有2i-1个结点。
一共有i层的完全二叉树最多有2i-1个结点。

  • 父结点和子结点的序号有对应关系,当根结点的序号值为 1 的情况下,若父结点的序号是 i,那么左子结点的序号就是 2i,右子结点的序号是 2i+1。

例如:利用这个特点,完全二叉树利用数组存储时可以极大地节省空间,以及利用序号找到某个结点的父结点和子结点。

二叉树的存储

二叉树的存储主要分为 顺序存储 和 链式存储 两种:

顺序存储

二叉树的顺序存储,指的是使用顺序表(数组)存储二叉树。需要注意的是,顺序存储只适用于完全二叉树。满二叉树也是完全二叉树,所以同样适用。
在顺序存储中,顺序表(数组)中的每一个位置仅存储结点的 data,不需要存储左右子结点的指针,子结点的索引通过计算父结点下标完成。

  • 假设一个父结点的下标是parentIndex,它的左子结点下标 = 2×parentIndex,右子结点下标 = 2×parentIndex + 1
  • 假设一个左子结点的下标是leftChildIndex,它的父结点 下标 = leftChildIndex/ 2
  • 假设一个左子结点的下标是rightChildIndex,它的父结点 下标 = (rightChildIndex-1)/ 2

如果完全二叉树,使用数组顺序存储,可以充分利用数组空间,如下图所示:

如果普通二叉树,使用数组顺序存储,在数组中就会出现空隙,导致内存利用率降低,如下图所示:

二叉树的顺序存储:

public class BinaryTree<E> {private Object[] elementData = null;public BinaryTree(E[] elements) {elementData = new Object[elements.length + 1];for (int i = 0, index = 1; i < elements.length; i++, index++) {elementData[index] = elements[i];}}public E get(int index) {return (E) elementData[index];}public E left(int index) throws Exception {if ((index << 1) >= elementData.length) {throw new Exception("左孩子节点不存在!");}return (E) elementData[index << 1];}public E right(int index) throws Exception {if ((index << 1) + 1 >= elementData.length) {throw new Exception("右孩子节点不存在!");}return (E) elementData[(index << 1) + 1];}
}

测试:

public class Test {public static void main(String[] args) throws Exception {BinaryTree<String> tree = new BinaryTree<String>(new String[] {"a","b","c","d","e","f","g","h"});System.out.println(tree.get(1));System.out.println(tree.left(1));System.out.println(tree.right(1));}
}

链式存储

二叉树的链式存储依靠指针将各个结点串联起来,不需要连续的存储空间。
每个结点包括3个属性:

  • 数据 Data
  • 左孩子结点指针 Left
  • 右孩子结点指针 Right

二叉树的链式存储:

public class BinaryTree<E> {TreeNode<E> root;public BinaryTree(E val) {root = new TreeNode<E>(val);}// 结点类static class TreeNode<E> {E data; // 数据TreeNode<E> left; // 左子结点TreeNode<E> right; // 右子结点// 无参构造方法public TreeNode() {}// 有参构造方法public TreeNode(E val) {this.data = val;}}public TreeNode<E> left(TreeNode<E> parent, E val) {TreeNode<E> newNode = new TreeNode<E>(val);parent.left = newNode;return newNode;}public TreeNode<E> right(TreeNode<E> parent, E val) {TreeNode<E> newNode = new TreeNode<E>(val);parent.right = newNode;return newNode;}
}

二叉树的遍历

  • 前序遍历:根结点->左子树->右子树(根->左->右)
  • 中序遍历:左子树->根结点->右子树(左->根->右)
  • 后序遍历:左子树->右子树->根结点(左->右->根)

前序遍历

前序遍历根结点->左子树->右子树(根->左->右)
二叉树的前序遍历也叫先序遍历,就是先输出根结点,再遍历左子树,最后遍历右子树,遍历左子树和右子树的时候,同样遵循先序遍历的规则(可以递归实现先序遍历)。

前序遍历:

public void preOrder(TreeNode root){if(root == null){return;}System.out.println(root.data);preOrder(root.left);preOrder(root.right);
}

中序遍历

中序遍历:左子树->根结点->右子树(左->根->右)
二叉树的中序遍历,就是先递归中序遍历左子树,再输出根结点的值,再递归中序遍历右子树。

中序遍历:

public void inOrder(TreeNode root){if(root == null){return;}inOrder(root.left);System.out.println(root.data);inOrder(root.right);
}

后序遍历

后序遍历:左子树->右子树->根结点(左->右->根)
二叉树的后序遍历,就是先递归后序遍历左子树,再递归后序遍历右子树,最后输出根结点的值

后序遍历:

public static void postOrder(TreeNode root){if(root == null){return;}postOrder(root.left);postOrder(root.right);System.out.println(root.data);
}

还原二叉树

已知某二叉树的前序遍历为A-B-D-F-G-H-I-E-C,中序遍历为F-D-H-G-I-B-E-A-C,请还原二叉树。

技巧:前序和后序确定根,中序确定左右子树

已知某二叉树的前序遍历为A-B-C-D-E-F-G-H,中序遍历结果为C-D-B-A-G-F-E-H,请还原二叉树。

已知某二叉树的中序遍历为F-D-H-G-I-B-E-A-C,后序遍历的结果为F-H-I-G-D-E-B-C-A,请还原二叉树。

已知某二叉树的中序遍历为D-B-E-A-F-I-H-C-G,后序遍历的结果为D-E-B-H-I-F-G-C-A,请还原二叉树。

层序遍历

层序遍历,就是按二叉树从上到下,从左到右,依次打印每层中每个结点存储的数据。

层序遍历:

public void levelOrder(TreeNode root) {if (root == null) {return;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (true) {TreeNode cur = queue.poll();if (cur == null) {break;}// 访问当前节点. 就用打印表示访问即可.System.out.print(cur.data);// 把该节点的左子树入队列, 右子树入队列if (cur.left != null) {queue.offer(cur.left);}if (cur.right != null) {queue.offer(cur.right);}}
}

http://www.dtcms.com/a/467219.html

相关文章:

  • 郑州网站开发培训班o2o网站系统建设
  • Lampiao渗透项目学习记录
  • 新功能来袭——支持导出MIDI文件,AI音乐从此进入新篇章
  • 网站推广活动方案权威网站排名
  • Google 智能体设计模式:工具使用(函数调用)
  • 网站开发的技术类型有哪些网络服务代码1001
  • Redis-string
  • 网站网页的收录数量赤峰建设厅官方网站
  • 做灯箱的网站wordpress nginx apache
  • (7)100天python从入门到拿捏《迭代器和生成器》
  • 花卉网站建设策划书核酸二维码
  • 00--VSCode配置
  • 光明区建设局网站抖音代运营成功案例
  • 宁波论坛建站模板珠海市建设工程信息网
  • 温州做网站价格外贸推广软件
  • 自己建的网站也要注册域名吗电子商务网站建设与维护试卷答案
  • Java项目:基于SSM框架实现的连锁干洗店管理系统(ssm+B/S架构+源码+数据库+毕业论文)
  • 国外装饰公司网站郑州网站seo厂家
  • 如何建立免费个人网站盘龙区网站建设外包
  • 供热设施网站搭建教程品牌推广名词解释
  • 算法社Python基础入门面试题库(新手版·含答案)
  • 网站建设与管理 自考wordpress邮箱社交
  • Day59 SPI驱动与ADXL345传感器应用及Linux系统移植基础
  • 做网站有限公司外贸企业有哪些公司
  • 设计师接私活的网站深圳装修设计培训
  • 数据密度与视觉层次:让信息既丰富又不乱
  • 银川市网站制作公司邢台网站建设基本流程
  • 浏览器解析HTML完整教程
  • dns加网站家具网站建设策划
  • 备案网站制作汽车租赁网站设计