树/二叉树/哈夫曼树/图代码示例

树形结构:逐层向下

根:有且只有一个

子树:除根外其余所有结点分属于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.重复直到剩一棵树

哈夫曼树和哈夫曼编码

通信网,交通网

有向图  无向图  有权图

弧(有向)   边(无向)

路径:从顶点出发,沿边或弧

路径长度:边或弧的条数

连通图;任意一对顶点都是联通的

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

挣钱钱暴富富

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值