求树的深度

1.以孩子兄弟链表作为存储结构

//数据结构
typedef struct csnode{ 
 elemtype data;
 struct csnode *firstchild,*nextsibling;
}csnode,*cstree;
//算法
int depth(cstree t){ 
 csnode *p;
 int m,d;
 if(t==null) return 0;
 p=t->firstchild;
 m=0;  //最大深度初始为0
 while(p){
  d=depth(p);
  if(d>m) m=d;//更新最大深度
  p=p->nextsibling;
 }
 return m+1;//子树的最大深度加上根节点的深度
}

2.利用层次遍历,还是用上述数据结构
算法思想:利用队列,将节点按层次顺序入队,出队,访问。出队访问的时候,要判断该节点是否为该层最右节点(怎么判断??),如果是,深度加1。并且再出队访问下一层。

int depth( cstree *t){
 if(t==null) return 0;
 initqueue(Q);
 int d=level=0;//d表示深度,level表示当前所在层
 cstree last=p=t;//last表示该层最后一个节点
 enqueue(Q,p);//根节点入队
 while(!empty(Q)){
  dequeue(Q,p);//出队

  //先将p的孩子入队,以防遇到最右节点时,last找不到下一层的最右节点
  if(p->firstchild){//如果存在孩子
   p=p->firstchild;
   enqueue(Q,p);
   p=p->nextsibling;
   while(p){//将所有的孩子入队
    enqueue(Q,p->nextsibling);
    p=p->nextsibling;
   }//循环结束时p==null
  } 
  if(p==last){
    d++;
    last=Q.data[Q.rear];
  }
 } 
 return d;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值