树形结构:逐层向下
根:有且只有一个
子树:除根外其余所有结点分属于m个不相交的集合,每个集合又构成一个树,称为根结点的子树
叶子结点:度为0的结点
结点的度:树中的一个结点拥有的子树的个数
树的度:一棵树中最大的结点度数
树的深度:树中结点的最大层次数(根结点层次为1)
二叉树为有序树!!!子树的位置自左向右有次序关系
1.二叉树的结点代码
struct BinTreeNode
{
char data;
struct BinTreeNode* leftChild, * rightChild;
};
2.定义一个二叉树:定义一个空树,一个空指针
BinTreeNode *toot; //定义根结点指针
root=NULL; //定义空树
3.新建一个结点
BinTreeNode *p=new BinTreeNode;
p->data='A'; //给数据域赋值
p->leftChild=NULL; //左子树为空
p->rightChild=NULL; //右子树为空
4.建立二叉树
p->leftChild=q;
p->rightChild=r;
完全二叉树编号:从上到下,从左至右
i=1是二叉树的跟
完全二叉树可以使用一维数组存储:空出下标为0的位置,将结点存储在下标为其编号的位置
一般二叉树呢?添加虚结点生成完全二叉树
二叉树的遍历:按照某种顺序遍历二叉树中每一个结点,并且每个结点只被访问一次
访问:取出数据,输出,等等
1.先序遍历:根-左子树-右子树
2.中序遍历:左子树-根-右子树
3.后续遍历:
void 先序遍历(BinTreeNode* p)
{
if(p)
{
visit(p); //访问根结点
先序遍历(p->leftChild); //先序遍历左子树
先序遍历(p->rightChild); //先序遍历右子树
}
}
哈夫曼树:以一些带有固定权值的结点作为叶子所构造的,具有最小带权路径长度的二叉树
有权值的结点都是叶子结点
二叉树带权路径长度WPL:二叉树具有n个带有权值的叶子结点,每个叶子到根的路径长度乘以其权值之和
下图A为哈夫曼树
哈夫曼树的构造:
1.根据n个权值,构造n棵二叉树,其中每棵二叉树中只含一个权值为Wi的根结点
2.在所有二叉树中选择根结点权值最小的两棵树,分别作为左右子树构造一棵新的二叉树,这棵新的二叉树根结点权值为其左右子树根结点的权值之和,删去之前的两棵树,留下刚生成的新树
3.重复直到剩一棵树
哈夫曼树和哈夫曼编码
图
通信网,交通网
有向图 无向图 有权图
弧(有向) 边(无向)
路径:从顶点出发,沿边或弧
路径长度:边或弧的条数
连通图;任意一对顶点都是联通的