数据结构 6.19知识点----线索二叉树、哈夫曼树、图的基本概念

知识点回顾—线索二叉树
遍历实际上将非线性的二叉树,线性化的过程

某个结点,在某种遍历序列中,找出前驱及后继结点

struct BiTNode{//二叉链存储结构中,结点的数据类型定义
char data;
struct BiTNode *lchild;//左链(指向左孩子结点)
struct BiTNode *rchild;//右链(指向右孩子结点)

};

此时可以利用二叉链存储结构中的空链来存储结点的前驱和后继信息,n个结点的二叉树,在二叉链存储结构中,一定有n+1个空链

为了区分左链指向左孩子还是前驱(线索),右链指向右孩子还是后继(线索),增加线索标志变量(int)
ltag ---- 0说明lchild指向左孩子,1说明lchild指向前驱
rtag------0说明rchild指向右孩子,1说明rchild指向后继

修改后的代码:
struct ThBiTNode{//线索二叉树,结点的数据类型定义
char data;
struct ThBiTNodee *lchild;//左链(指向左孩子结点或者前驱)
int ltag;
struct ThBiTNode *rchild;//右链(指向右孩子结点或后继)
int rtag;

};

1、某个结点,在中序遍历中,寻找前驱结点:
1)如果ltag为1,没有左孩子,则lchild指向的结点即为前驱
2)如果ltag为0,有左孩子,lchild指向的结点为左孩子,此时前驱结点一定是中序遍历左子树最后一个结点,即左子树最右下的结点

找p指向结点的前驱结点
struct ThBiTNode preNode(struct ThBiTNode p)
{
if(p->ltag==1)

return p->lchild;
if(p->ltag==0)

p=p->lchild;
while(p->rtag==0)
p=p->rchild;
return p;
}

2、某个结点,在中序遍历中,寻找后继结点:

1)如果rtag为1,没有右孩子,则rchild指向的结点即为后继
2)如果rtag为0,有右孩子,此时后继结点一定是中序遍历右子树第一个结点,即右子树最左下的结点

找p指向结点的后继结点
struct ThBiTNode nextNode(struct ThBiTNode p)
{
if(p->rtag==1)

return p->rchild;
else
p=p->rchild;
while(p->ltag==0)
p=p->lchild;
return p;

}

哈夫曼树(带权路径长度最短的二叉树)----哈夫曼编码(编码长度最短,且译码唯一)

树转换为二叉树方法
1)树中所有相同双亲结点的兄弟结点之间加一条连线
2)对树中不是双亲结点第一个孩子的结点,只保留新添加的该结点与左兄弟结点之间的连线,删去该结点与双亲结点之间的连线
3)整理连线,使每个结点的第一个孩子结点位于左孩子位置,右兄弟结点位于右孩子位置

注意:一棵树一定可以转换为一颗二叉树,并且转换后的二叉树,根结点一定没有右孩子。

二叉树还原为树
1)若某结点是其双亲结点的左孩子,则把该结点的右孩子、右孩子的右孩子…都与该结点的双亲结点用线连接起来
2)删除原二叉树中所有双亲结点与右孩子结点的连线
3)整理连线,使每个结点的所有孩子位于相同层次

注意:不是所有的二叉树都可以转换成一颗树。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值