1.树
- 定义(递归、嵌套的)
- n个结点的有限集
- n=0,空树
- n>0,满足两个条件
- 有且仅有一个特定的称为根的结点
- 其余结点可分为m个互不相交的有限集,其中每一个集合本身又是一颗树,称为根的子树
- n个结点的有限集
- 树的表示方式
- 常规
- 嵌套集合
- 凹入表示
-
广义表
- 常规
2.树的基本术语
- 结点:数据元素以及指向子树的分支
- 根结点:非空树中无前驱结点的结点
- 叶子结点(终端结点):度为0
- 内部结点(非终端结点):根结点以外的分支结点
- 度
- 结点的度:结点拥有的子树数
- 树的度:树内各结点的度的最大值
- 深度:树中结点的最大层次
- 孩子:结点的子树的根称为该结点的孩子
- 双亲:该结点称为孩子的双亲
- 兄弟:有共同的双亲
- 堂兄弟:双亲在同一层的结点
- 祖先:从根到该结点所经分支上的所有结点
- 子孙:以某结点为根的子树中的任一结点
- 有序树:树中结点的各子树从左到右有次序
- 无序树:树中结点的各子树无次序
- 森林:m(m>=0)棵互不相交的树的集合
- 把根结点删除,树就变成了森林
- 一棵树可以看成一个特殊的森林
- 给森林中的各子树加上一个双亲结点,森林就变成了树
树结构与线性结构的比较
3.二叉树
- 定义
- n个结点的有限集
- n=0,空集
- 由一个根结点及两颗互不相交的分别称作根的左子树、右子树的二叉树组成
- n个结点的有限集
- 特点
- 1每个结点最多有两个孩子
- 2子树有左右之分,其次序不能颠倒
- 3二叉树可以是空集合,根可以有空的左子树或空的右子树
- 注意
- 二叉树和树是两个概念
- 二叉树的5种基本形态
-
两种特殊形式的二叉树(在顺序存储方式下可以复原)
-
满二叉树
-
特点
-
每一层上的结点数都是最大结点树(每层都满)
-
叶子结点全部都在最底层
-
-
满二叉树在同样深度的二叉树中结点个数、叶子结点个数最多
-
完全二叉树
-
特点
-
叶子只可能分布在层次最大的两层上面
-
对任一结点,如果其右子树的最大层次为i,则其左子树的最大层数必为i或i+1
-
-
判断是不是完全二叉树的方法
-
标号
-
从满二叉树中,从最后一个结点 连续去掉任意个结点
-
-
4.二叉树的性质和存储结构
性质1:
在第i层最少有1个结点
性质2:
深度为k时至少有k个结点
性质3:
性质4:
性质5:(完全二叉树中双亲结点编号与孩子结点编号之间的关系)
二叉树的存储结构
- 顺序存储:按满二叉树的结点层次编号,依次存放二叉树中的数据元素
- 缺点:浪费空间
- 特点:适合满二叉树和完全二叉树
- 链式存储
例题1
5.1遍历二叉树
遍历定义:顺着某一条搜索路径巡防二叉树中的结点,使得每个结点均被访问一次,而且仅被访问一次(周游)
遍历方法:
若规定先左后右,则只有三种情况
先序遍历二叉树
操作定义:
中序遍历二叉树
操作定义:
后序遍历二叉树
操作定义:
例题1
例题2——用二叉树表示算术表达式
总结:
1先序:根左右,先遍历根结点,若左子树里面还有子树,继续根据“根左右”进行遍历
2中序:左根右,先遍历最左边的元素,再根据“左根右”继续遍历
3后序:左右根,先遍历最左边的元素,在遍历右子树的元素;若右边是个子树,再继续从“左右根”进行遍历
5.2根据遍历序列确定二叉树
若二叉树中各结点的值均不相同,则二叉树结点的先序序列、中序序列和后序序列都是唯一的
由二叉树的先序序列和中序序列,或由二叉树的后序序列和中序序列可以确定唯一一颗二叉树
例题1——已知先序和中序序列求二叉树
解:1、由先序知根为A,则由中序知左子树为CDBFE,右子树IHGJ
2、再分别在左、右子树的序列中找出根、左子树序列、右子树序列
3、以此类推,得到二叉树
总结:
1先序中的第一个元素往往是根结点,在中序中找到根结点(前面为左子树,后面为右子树)
2先序中第二个元素再在所划分的左子树进行筛选(前面为左子树,后面为右子树)
3(两个元素)在先序中判断出了根结点,在根据中序的定义(左根右)判断后一个元素的位置
例题2——已知中序序列和后序序列求二叉树
解:
总结:
1后序(左右根)的最后一个元素为根结点,在中序中划分为左子树和右子树
2划分完的左子树在根据后序中的顺序进行排序,后序中根结点在最后,中序中为左根右
3划分完的右子树以此类推
5.3遍历(递归)的算法实现
1 先序遍历
先序递归算法研究(先序:ABDC)
基于c++
2 中序遍历
中序遍历递归算法
3后序算法
后序遍历递归算法
遍历算法分析
- 从递归角度看,三种算法是完全相同的(访问路径是相同的),只是访问结点的时机不同
- 时间效率:O(n),//每个结点只访问一次
- 空间效率:O(n),//栈占用的最大辅助空间
5.4遍历二叉树的非递归算法
中序遍历非递归算法(思路:栈(后进先出))
5.5二叉树的层次遍历算法
基本算法:
1 复制二叉树
2计算二叉树的深度
3计算二叉树的结点数
4计算二叉树叶子结点树
5.6 线索二叉树
定义:利用二叉链表中的空指针域
- 如果某个结点的左孩子为空,则将空的左孩子指针域改为指向其前驱
- 如果某个结点的右孩子为空,则将空的右孩子指针域改为指向其后继
- 线索:改变指向的指针
- 线索化:对二叉树按某种遍历次序使其变为线索二叉树的过程
标志域
先序线索二叉树
中序线索二叉树
后序线索二叉树