数据结构(七)二叉树

定义

特点

特殊的二叉树

斜树

顾名思义,其中的结点都只有一个,又分为左斜树和右斜树,这时候又有疑惑了,这种数据结构不是有线性表一样吗,没错,线性表是一种特殊的树

满二叉树

完全二叉树

这个定义有点绕,简单来说就是所有的结点必须是有顺序的,不能跳跃存在

二叉树的性质

1.在二叉树的第i层至多有2的(i-1)次方个结点,参考满二叉树

2.深度游k的二叉树至多有2的k次方-1个结点,参考满二叉树

3.任意二叉树,终端结点为n0,度为2的结点为n2,度为1的结点为n1,则n0=n2+1

下面是推倒过程,设连接线为x,总结点数为n,则:

n=n0+n1+n2

x=n1+2n2

x=n-1

求得n0=n2+1

存储结构

二叉树的顺序结构

这有点像广度优先遍历,但这里关注的是存储结构,不是遍历方式,顺序结构一般只用于满二叉树,普通二叉树会有空间浪费,例如(^表示空)

二叉链表

一个数据域,两个指针域分别表示左孩子和右孩子

二叉树的遍历

前序遍历

中序遍历

后序遍历

层序遍历

这四种遍历名称都是针对每一个根结点而言,

前序:先遍历根节点(深度优先遍历)

中序:中间遍历根节点

后序:最后遍历根节点

层序:从根节点一层一层往下遍历(广度优先遍历)

线索二叉树

定义

指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索二叉链表,相应的二叉树就成为思安所二叉树

还需要证明前驱后后继是否为孩子,所以加入了两个标志位,单个结点的结构如下

场景

赫夫曼树及其应用

定义及原理

从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称做路径的长度

例如这两个二叉树

二叉树a中,从根结点到D结点的路径为4,二叉树b中,从根结点到D结点的路径为2

二叉树a的树路径长度为1+1+2+2+3+3+4+4=20

二叉树b的树路径长度为1+1+2+2+2+2+2+3+3=16

如果考虑带权路径,路径与权的乘积才是最终的路径长度

定义

也称为最优二叉树

如何构建赫夫曼树

如何构建赫夫曼树总结

赫夫曼树的应用-赫夫曼编码

定义

数据压缩的原理基于此

时间: 2024-10-18 10:35:46

数据结构(七)二叉树的相关文章

数据结构:二叉树的链式存储

数据结构:二叉树的链式存储(C语言版) 1.写在前面 二叉树同样有两种存储方式,数组和链式存储,对于数组来说,我们利用二叉树的性质然后利用下标可以方便的找到一个节点的子节点和父节点. 二叉树的性质: 1.二叉树的第i层上至多有2i-1个节点 2.深度为K的二叉树至多有2k-1个节点 3.任何一个二叉树中度数为2的节点的个数必度数为0的节点数目少1. 说明:度数为0,为叶子节点. 4.具有n个节点的完全二叉树的深度为|_Log2N_|+1 5.若完全二叉树中的某节点编号为i,则若有左孩子编号为2i

数据结构之二叉树查找

数据结构之--二叉树查找 定义:它是一棵树,或者具有以下性质的树.  若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值: 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值:  它的左.右子树也分别为二叉排序树: 图解: ?        ?    ?    ?    ?    ?? #include<stdio.h> #include<stdlib.h> typedef int Status; #define TRUE 1 #define FALSE 0 t

数据结构之二叉树遍历

二叉树的 二叉树节点的描述 public class BiTNode { char data; BiTNode lc,rc; } 下面我们分别用递归和非递归实现前.中.后序遍历,以及使用了两种方法来进行层次遍历二叉树,一种方法就是使用STL中的queue,另外一种方法就是定义了一个数组队列,分别使用了front和rear两个数组的下标来表示入队与出队. 1.前序遍历 未完待续... 数据结构之二叉树遍历,布布扣,bubuko.com

【算法与数据结构】二叉树 中序线索

中序线索二叉树 /************************************************************************ 线索二叉树 二叉树的节点有五部分构造 ----------------------------------------- | lChild | lTag | value | rTag | rChild | ----------------------------------------- lChild = (lTag == 0 ? 左

【算法与数据结构】二叉树的 中序 遍历

前一篇写了二叉树的先序遍历,本篇记录一下二叉树的中序遍历,主要是非递归形式的中序遍历. 由于距离上篇有好几天了,所以这里把二叉树的创建和存储结构也重复的写了一遍. 二叉树如下 二叉树的存储方式依然是二叉链表方式,其结构如下 typedef struct _tagBinTree { unsigned char value; struct _tagBinTree* left; struct _tagBinTree* right; }BinTree, *PBinTree; 先序递归形式的创建二叉树代码

数据结构之二叉树的遍历汇总

声明:小弟写博客不久,主要是边上班边学习边写博客,如果错误,望各位包涵并指导. 二叉树是一种常用的非线性数据结构,二叉树是由一个根节点和称为根的左.右子树的两颗互不相交的二叉树构成.二叉树具有一些特殊的性质,如第i层上最多有2^(i-1)个结点.二叉树的链式存储结构如下: typedef struct BTNode { char data; //字符型数据; struct BTNode* lChild,*rChild; //左右子结点的指针; }BTNode,*BiTree; data为二叉树中

采用栈数据结构的二叉树遍历

[前言]树的遍历,根据访问自身和其子节点之间的顺序关系,分为前序,后序遍历.对于二叉树,每个节点至多有两个子节点(特别的称为左,右子节点),又有中序遍历.由于树自身具有的递归性,这些遍历函数使用递归函数很容易实现,代码也非常简洁.借助于数据结构中的栈,可以把树遍历的递归函数改写为非递归函数. 在这里我思考的问题是,很显然,循环可以改写为递归函数.递归函数是否借助栈这种数据结构改写为循环呢.因为函数调用中,call procedure stack 中存储了流程的 context,调用和返回相当于根

python环境下使用mysql数据及数据结构和二叉树算法(图)

python环境下使用mysql数据及数据结构和二叉树算法(图):1 python环境下使用mysql2使用的是 pymysql库3 开始-->创建connection-->获取cursor-->操作-->关闭cursor->关闭connection->结束45 代码框架6 import pymysql.cursors7 ###连接数据库8 connection = pymysql.connect(host='127.0.0.1',port=3306,user='roo

算法与数据结构(七):快速排序

在上一篇中,回顾了一下针对选择排序的优化算法--堆排序.堆排序的时间复杂度为O(nlogn),而快速排序的时间复杂度也是O(nlogn).但是快速排序在同为O(n*logn)的排序算法中,效率也是相对较高的,而且快速排序使用了算法中一个十分经典的思想--分治法:因此掌握快速排序还是很有必要的. 快速排序的基本思想如下: 在一组无序元素中,找到一个数作为基准数. 将大于它的数全部移动到它的右侧,小于它的全部移动到右侧. 在分成的两个区中,再次重复1到2 的步骤,直到所有的数全部有序 下面还是来看一

浅谈数据结构之二叉树存储结构实现(七)

树:是n个结点的有限集:n=0时称为空树.在任意一棵非空树中,有且只有一个特定的结点称为根结点:其余的结点可分为m(m>0)个互不相交的有限集,其中每一个有限集都是一棵子树.结点拥有的子树数称为结点的度:度为0的结点称为叶结点或者终端结点,度不为0的结点称为分支结点或者非终端结点:树的度就是树内各结点的度的最大值. 二叉树的特点有:(1).每个结点最多有两棵子树,所以二叉树不存在度大于2的结点(注意:不是只有两棵子树,而是最多有两棵子树,没有子树或者有一颗子树都是可以的);(2).左子树和右子树