求解森林相关问题函数(高度,结点数,与二叉树的转化)

数据结构复习总结

森林相关问题函数(持更

  1. 求森林的叶子节点数
  2. 树转化为二叉树
  3. 求森林的高度
  4. 层次遍历输出森林中节点的值和层数
struct tnode {    //树结构结点类型    
    struct tnode *firstson, *nextbrother;      // 指示第一个孩子和下一个兄弟的指针    
    char data;                         // 数据字段
};
typedef struct tnode * tree;       // 树结构指针类型
struct bnode {    
    struct bnode * lchild, * rchild;    
    char data;
};
typedef bnode * bitre;

1. 求森林的叶子节点数

int leaf(tree t){    
   if (t == NULL) return 0;    
    else {        
        if (t->firstson==NULL)   return 1 + leaf(t->nextbrother);        
        else   return    leaf(t->nextbrother) + leaf(t->firstson);
    }
}

2.树转化为二叉树

bitre solve(tree t){  
    bitre T=new bnode;    
    if(t==NULL) T=NULL;    
    else{        
        T->data=t->data;        
        T->lchild=solve(t->firstson);        
        T->rchild=solve(t->nextbrother);    
    }      
    return T;
}

3. 求森林的高度

int solve(tree t){    
    if(t) return max(solve(t->firstson)+1,solve(t->nextbrother));    
    else  return 0;
}

4. 层次遍历森林

void solve(tree t){  
    int height = 1;   
    queue<tree> st;   
    st.push(t);   
    tree s=new tnode;   
    while(!st.empty()){        
        int len=st.size();  //队列的长度代表上一层有几个分支        
        for(int i=0;i<len;i++){            
            s=st.front();            
            st.pop();            
            while(s){                
                cout<<s->data<<" "<<height<<endl;                
                if(s->firstson)   
                    st.push(s->firstson);                
                s=s->nextbrother;            
            }        
        }        
        height++;   //该层循环完毕,高度加一
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值