二叉树的基本操作

#include<bits/stdc++.h>
#define ll long long
//#define int ll
#define pii pair<int,int>
#define mem(a,b) memest(a,b,sizeof(a))
#define endl '\n'
#define N 100005
const int inf=0x3f3f3f3f;
const double pi=acos(-1.0);
using namespace std;
int c=0;
int sum[N],co=-1;
typedef struct TNodes//定义二叉树 
{
    char data;
    TNodes *lnode,*rnode;
}*TNode;

void CreatTree(TNode &t) //创建二叉树 
{
    char c;
    cin>>c;
    if(c=='#') t=NULL;
    else
    {
        t=new TNodes;
        t->data=c;
        CreatTree(t->lnode);
        CreatTree(t->rnode);
    }
}

int Depth(TNode t)// 求二叉树深度 
{
    if(!t) return 0;
    int m=Depth(t->lnode);
    int n=Depth(t->rnode);
    if(m>n) return m+1;
    else return n+1; 
}

int jds(TNode t)//求树叶节点数
{
    if(!t) return 0;
    if(!t->lnode&&!t->rnode) return 1;
    return jds(t->lnode)+jds(t->rnode);
}

void Width(TNode t,int k)//求宽度
{
    co=max(co,k);
    if(!t) return;
    if(!t->lnode&&!t->rnode) sum[k]++;
    Width(t->lnode,k+1);
    Width(t->rnode,k+1);
}

int Tree2(TNode t)// 树叶结点为2的个数(c为全局变量) 
{
    if(!t) return 0;
    if(t->lnode&&t->rnode) c++;
    Tree2(t->lnode);
    Tree2(t->rnode);
    return c;
}

int Tree1(TNode t)// 树叶结点为1的个数
{
    if(!t) return 0;
    if(t->lnode&&!t->rnode) c++;
    else if(!t->lnode&&t->rnode) c++;
    Tree1(t->lnode);
    Tree1(t->rnode);
    return c;
}

int get(TNode t)//空链域个数 
{
    if(!t) return 0;
    if(!t->lnode) c++;
    else(get(t->lnode));
    if(!t->rnode) c++;
    else(get(t->rnode));
    return c;
}

void houxu(TNode t)//先序转后序 
{
    if(t)
    {
        houxu(t->lnode);
        houxu(t->rnode);
        cout<<t->data;   //转什么序把这句放到哪 
    }
}

signed main()
{
    TNode t;//定义 
    CreatTree(t);
    cout<<Depth(t);
    cout<<jds(t);
    
    Width(t,1);
    int Max=-1;
    for(int i=1;i<=co;i++)
    {
        Max=max(Max,sum[i]);
    }
    cout<<Max;
    
    cout<<Tree1(t);
    cout<<Tree2(t);
    cout<<get(t);
    houxu(t);
    return 0; 
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值