数据结构--邻接多重表下的无向图的生成树

这篇我们来解决下上一篇留下的两个问题:深度优先生成树和广度优先生成树如何建立?

1.深度优先生成树
首先,我们需要读懂的是邻接表下的深度优先生成树,因为这种结构下的方法比较容易推敲,理解之后进而推广到邻接多重表上。

我们先以《数据结构(C语言版)》–严蔚敏、吴伟民编著的教材上算法7.7为例,分析下深度优先生成树是如何建立的:

void DFSTree(Graph G,int v,CSTree &T)
{
    //从第v个顶点出发深度优先遍历图G,建立以T为根的生成树。
    visited[v]=true;
    bool first=true; 
    for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
    {
        if(!visited[w])
        {
            p=(CSTree)malloc(sizeof(CSNode));   //分配孩子结点 
            *p={GetVex(G,w),NULL,NULL}; 
            if(first)   //w是v的其他未被访问的邻接顶点 
            {
                T->lchild=p;    //是根的左孩子顶点 
                first=false;
            }
            else    //w是v的其他未被访问的邻接顶点 
            {
                q->nextsibling=p;   //是上一邻接顶点的右兄弟结点 
            }
            q=p;
            DFSTree(G,w,q);
        }
    }
}

我们看看邻接表下需要什么,那么我们也为邻接多重表提供什么:

1.CSNode结构体 //树的结点结构体,拥有数据域,左孩子结点指针域,右兄弟结点指针域
2.全局变量visited[]; //访问标志数组
3.局部变量first; //是否第一个被访问的标志
4.int w=FirstAdjVex(G,v); //w是顶点v的第一个邻接顶点,我在上一篇文章中已经给出了AdjVexNotVisit函数,用于查找未访问的邻接顶点,很好,可以直接使用这个函数 。
5.p=(CSTree)malloc(sizeof(CSNode));
*p={GetVex(G,w),NULL,NULL}; //分配一个新的孩子结点,并初始化它的内容。那么我们可以用C++的语言完成这件事:
CSNode *p=new CSNode; //为该邻接点创建孩子结点
p->data=w;
p->firstchild=NULL;
p->nextsibling=NULL;

很好,现在我们需要的元素都有了。接下来,只要替换邻接表中的元素就完成了:

typedef struct CSNode   
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值