二叉树
二叉树是应用最为广泛的数据结构之一,它是一个有穷的结点集合。直观表示如图所示:
二叉树有五种基本形式,分别为空树、只有一个结点、只有左子树、只有右子树、左右子树都有。如下图所示:
在二叉树这种数据结构的描述中,有几个常用的概念:
1.度(Degree):结点子树个数;
2.叶结点:度为0的结点;
3.父结点:有子树的结点是其子树根结点的父结点;
4.子结点:父结点的孩子结点;
5.路径及路径长度:路径为从某结点到另一结点走过的边,路径长度为边的权重和;
6.结点的层次(Level):树根在第一层,其它依次加1;
7.树的深度(Depth):结点的最大层次。
性质
(1)第i层的最大结点数:2^(i-1);
(2)深度为h的二叉树最大结点数:2^k-1;
(3)对任何非空二叉树,叶结点数=度为2的结点数+1.
遍历
深度优化搜索(DFS)
可理解为对于一个父结点,穷尽它的子树,直到叶结点。对于二叉树来说,共有三种DFS方法,分别是前序、中序、后序。如下表所示:
方法 | 过程 |
---|---|
前序遍历 | 先访问根结点,再访问左、右子树 |
中序遍历 | 先访问左子树,再访问根结点,后访问右子树 |
后序遍历 | 先访问左子树,再访问右子树,后访问根结点 |
下面通过代码来说明其原理,以前序为例。
(1)递归法:
typedef struct TreeNode* BinTree;//定义BinTree为结点的指针类型
struct TreeNode{
//树的每个结点的形式
ElemType data;
BinTree left;
BinTree right;
};
void PreOrderTravelsal(BinTree bt){
if(bt){
cout<<bt->data<<" ";//输出当前结点的值
PreOrderTravelsal(bt->left);//将bt->left作为根结点递归调用
PreOrderTravelsal(bt