【数据结构 队列 + 二叉树】

本文介绍了一种实现二叉树的结构及其操作的方法,包括建立二叉树、计算节点总数、叶子节点数、最大宽度等,并展示了如何进行先序、中序交换及遍历。通过具体代码实例,帮助读者理解二叉树的基本概念和常用操作。

实现代码:

#include<iostream>
#include<queue>
using namespace std;
typedef struct node{
    char ch;
    node *lc,*rc;
}*tr,node;
void xg(tr &T){
    char c;
    cin >> c;
    if(c == '#') T = NULL;
    else{
        T = new node;
        T -> ch = c;
        xg(T -> lc);
        xg(T -> rc);
    }
}
int js(tr T,int &num){
    if(T == NULL) return 0;
    if(T -> lc == NULL && T -> rc == NULL) num++;
    return js(T -> lc,num) + js(T -> rc,num) + 1;
}
typedef struct node1{
    tr *ba; // 初始化时动态分配存储空间
    int f,n,ceng;
}node1;
int Initqu(node1 &q){
    q.ba = new tr[100];
    if(!q.ba) return 0;
    q.f = q.n = q.ceng = 0;
    return 1;
}
int enqu(node1 &q,tr t){
    if((q.n + 1) % 100 == q.f) return 0;
    q.ba[q.n] = t;
    q.n = (q.n + 1) % 100;
    q.ceng = q.ceng + 1;
    return 1;
}
int chuqu(node1 &q,tr &t){
    if(q.f == q.n) return 0;
    t = q.ba[q.f];
    q.f = (q.f + 1) % 100;
    return 1;
}
int z[100];
void cb(tr T,int &cut){
    node1 q;
    Initqu(q);
    if(!T) return ;
    enqu(q,T);
    while(q.f != q.n){
        chuqu(q,T);
        if(++z[q.ceng] > cut) cut = z[q.ceng];
        cout << T -> ch;
        if(T -> lc) enqu(q,T -> lc);
        if(T -> rc) enqu(q,T -> rc);
    }
}
void Xchange(tr &t){ // 先序交换
    tr p;
    if(t == NULL) return ;
    if(t -> lc == NULL && t -> rc == NULL) return ;
    p = t -> lc;
    t -> lc = t -> rc;
    t -> rc = p;
    Xchange(t -> lc);
    Xchange(t -> rc);
}
void Zchange(tr &t){ // 中 || 后 序交换
    if(t == NULL) return ;
    if(t -> lc == NULL && t -> rc == NULL) return ;
    Zchange(t -> lc);
    tr p;
    p = t -> lc;
    t -> lc = t -> rc;
    Zchange(t -> rc);
    t -> rc = p;
}
void sc(tr t){
    if(t == NULL) return ;
    sc(t -> lc);
    cout << t -> ch;
    sc(t -> rc);
}
int main()
{
    cout << "请输入二叉链表的序列 : " << endl;
    node *TR;
    xg(TR);
    int num = 0 ,ans = js(TR,num);
    cout << "该二叉树的总节点个数为 : " << ans << endl;
    cout << "该二叉树的叶子节点树为 : " << num << endl;
    int cut = 0;
    cb(TR,cut);
    cout << endl;
    cout << "该二叉树的宽度为 : " << cut << endl;
    Xchange(TR);
    sc(TR);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值