数据结构之二叉树
2014-04-12 11:53
232 查看
1、二叉树的递归定义
二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的、分别称作这个根的左子树和右子树的二叉树组成。
2、二叉树不是树的特例
(1)二叉树与无序树不同
二叉树中,每个结点最多只能有两棵子树,并且有左右之分。
二叉树并非是树的特殊情形,它们是两种不同的数据结构。
(2)二叉树与度数为2的有序树不同
在有序树中,虽然一个结点的孩子之间是有左右次序的,但是若该结点只有一个孩子,就无须区分其左右次序。而在二叉树中,即使是一个孩子也有左右之分。
3、二叉树的性质
性质1 二叉树第i层上的结点数目最多为2i-1(i≥1)。
性质2 深度为k的二叉树至多有2k-1个结点(k≥1)。
性质3 在任意-棵二叉树中,若叶子结点的个数为n0,度为2的结点数为n2,则no=n2+1。
证明:结点总数(记为n)应等于0度结点数、1度结点(记为n1)和2度结点数之和:n=no+n1+n2 (式子1)
1度结点有一个孩子,2度结点有两个孩子,故二叉树中孩子结点总数是:nl+2n2
树中只有根结点不是任何结点的孩子,故二叉树中的结点总数又可表示为: n=n1+2n2+1
(式子2)
由式子1和式子2得到: no=n2+1
4、二叉树的存储结构
顺序存储结构
该方法是把二叉树的所有结点按照一定的线性次序存储到一片连续的存储单元中。结点在这个序列中的相互位置还能反映出结点之间的逻辑关系。
① 对完全二叉树而言,顺序存储结构既简单又节省存储空间。
② 一般的二叉树采用顺序存储结构时,虽然简单,但易造成存储空间的浪费。
链式存储结构
二叉树的每个结点最多有两个孩子。用链接方式存储二叉树时,每个结点除了存储结点本身的数据外,还应设置两个指针域lchild和rchild,分别指向该结点的左孩子和右孩子。
5、二叉树的遍历
所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。
三种遍历方案:先序遍历、中序遍历、后序遍历
6、数与二叉树之间的转换
将树转换为二叉树
①在所有兄弟结点之间加一连线;
②对每个结点,除了保留与其长子的连线外,去掉该结点与其它孩子的连线。
将二叉树转换为树
若结点x是双亲y的左孩子,则把x的右孩子,右孩子的右孩子,…,都与y用连线连起来,最后去掉所有双亲到右孩子的连线。
二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的、分别称作这个根的左子树和右子树的二叉树组成。
2、二叉树不是树的特例
(1)二叉树与无序树不同
二叉树中,每个结点最多只能有两棵子树,并且有左右之分。
二叉树并非是树的特殊情形,它们是两种不同的数据结构。
(2)二叉树与度数为2的有序树不同
在有序树中,虽然一个结点的孩子之间是有左右次序的,但是若该结点只有一个孩子,就无须区分其左右次序。而在二叉树中,即使是一个孩子也有左右之分。
3、二叉树的性质
性质1 二叉树第i层上的结点数目最多为2i-1(i≥1)。
性质2 深度为k的二叉树至多有2k-1个结点(k≥1)。
性质3 在任意-棵二叉树中,若叶子结点的个数为n0,度为2的结点数为n2,则no=n2+1。
证明:结点总数(记为n)应等于0度结点数、1度结点(记为n1)和2度结点数之和:n=no+n1+n2 (式子1)
1度结点有一个孩子,2度结点有两个孩子,故二叉树中孩子结点总数是:nl+2n2
树中只有根结点不是任何结点的孩子,故二叉树中的结点总数又可表示为: n=n1+2n2+1
(式子2)
由式子1和式子2得到: no=n2+1
4、二叉树的存储结构
顺序存储结构
该方法是把二叉树的所有结点按照一定的线性次序存储到一片连续的存储单元中。结点在这个序列中的相互位置还能反映出结点之间的逻辑关系。
① 对完全二叉树而言,顺序存储结构既简单又节省存储空间。
② 一般的二叉树采用顺序存储结构时,虽然简单,但易造成存储空间的浪费。
链式存储结构
二叉树的每个结点最多有两个孩子。用链接方式存储二叉树时,每个结点除了存储结点本身的数据外,还应设置两个指针域lchild和rchild,分别指向该结点的左孩子和右孩子。
5、二叉树的遍历
所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。
三种遍历方案:先序遍历、中序遍历、后序遍历
6、数与二叉树之间的转换
将树转换为二叉树
①在所有兄弟结点之间加一连线;
②对每个结点,除了保留与其长子的连线外,去掉该结点与其它孩子的连线。
将二叉树转换为树
若结点x是双亲y的左孩子,则把x的右孩子,右孩子的右孩子,…,都与y用连线连起来,最后去掉所有双亲到右孩子的连线。
相关文章推荐
- 1291 数据结构上机测试4.1:二叉树的遍历与应用1
- 数据结构---搜索二叉树的插入、删除、查找
- JavaScript数据结构之二叉树的计数算法示例
- 每周数据结构【5】:在二叉树中递归查找为data值的点
- 数据结构--二叉树(C++)
- 数据结构二叉树
- 数据结构 第11讲 二叉树及其创建
- 【数据结构】二叉树四种遍历的非递归算法
- 【数据结构】扩充先序遍历创建二叉树
- 数据结构例程——二叉树的层次遍历算法
- 数据结构——二叉树
- 二叉树 - 数据结构和算法43
- 【数据结构】数据结构C语言的实现(简单二叉树)
- 数据结构《13》----二叉树 Morris 前序遍历
- java数据结构之二叉树
- 数据结构 第12讲 二叉树的层次遍历
- 数据结构-剑指offer-对称的二叉树
- C语言数据结构——数据结构有序二叉树的函数实现
- 数据结构(四) -- 二叉树
- 数据结构(树和二叉树的转换与遍历)