《C算法》——树

 二叉树 


定义
typedef struct node*  link;
struct
 node 
{
    Item item;
    link l, r; 
}
;

二叉树的先序遍历(递归)
void traverse(link h, void (* visit)(link))
{
    
if(h == NULL)    return
;
    (
*
visit)(h);
    traverse(h
->
l, visit);
    traverse(h
->
r, visit);
}

二叉树的先序遍历(非递归)
void traverse(link h, void (* visit)(link))
{
    STACKinit(max);
    STACKpush(h);
    
while(!
STACKempty())
    
{
        (
*visit)(h =
 STACKpop());
        
if(h->!= NULL)    STACKpush(h->r);    //右子树入栈

        if(h->!= NULL)    STACKpush(h->l);                         //左子树入栈
    }

}

若将上面的栈改为队列,则此遍历变为层序遍历
void traverse(link h, void(* visit)(link))
{
    QUEUEinit(max);
    QUEUEput(h);
    
while(!
QUEUEempty())
    
{
        (
*visit)(h =
 QUEUEget());
        
if(h->!= NULL)    QUEUEput(h->
l);
        
if(h->!= NULL)    QUEUEput(h->
r);
    }

}

树参数的计算
计算树的节点数(递归)
int  count(link h)
{
    
if(h == NULL)    return 0
;
    
return count(h->l)+count(h->r)+1
;
}

计算树的高度(递归)
int  height(link h)
{
    
int
 u, v;
    
if(h == NULL) return -1
;
    u 
= height(h->
l);
    v 
= height(h->
r);
    
if(u > v)    return u+1
;
    
else     return v+1
;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值