以孩子兄弟链表为存储结构,请设计非递归算法和递归算法求树的深度

  1. 这里简述孩子兄弟链表的非递归算法,如果A结点存在左孩子,且A结点的兄弟结点没有孩子,则该兄弟可以跳过不入队(因为A结点的兄弟结点树的高度不可能比A结点左孩子所在高度更高)
#define MaxSize 20
typedef struct CsNode{
    struct CsNode* firstchild;
    struct CsNode* nextsibling;
    int data;
}CsNode;

//递归遍历求以孩子兄弟链表表示的树的深度
int height(CsNode* node){ 
    if (node == NULL) {
        return 0;
    }
    int hchild = height(node->firstchild);
    int hsibling = height(node->nextsibling);
    int ret =  hchild+1 > hsibling ? hchild+1 : hsibling;
    return ret;
}

//非递归遍历求以孩子兄弟链表表示的树的深度
int heightNoRec(CsNode* t)    
{
    CsNode* Q[MaxSize];
    if(t == NULL)
        return 0;
    else{
        int front = 1,rear = 1;  //front,rear是队头队尾元素的指针
        int last = 1,h = 0;     //last指向树中同层结点中最后一个结点,h是树的高度
        Q[rear] = t;           //Q是以树中结点为元素的队列
        while(front <= last)
        {
            //cout<<"last:"<<last<<endl;
            t = Q[front++];       //队头出列
            while(t != NULL)     
            {
                if (t->firstchild)
                {
                    cout<<"enque:"<<t->firstchild->data<<endl;
                    Q[++rear] = t->firstchild; //第一子女入队
                }
                t = t->nextsibling; //同层兄弟指针后移
            }
            if(front > last)      //本层结束,深度加1(初始深度为0)
            {
                h++;
                last=rear;  //last再移到指向当前层最右一个结点
            } 
        }
        return h;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值