二叉树的创建(先序)先序中序后序遍历(递归算法),求叶子结点个数,求树的高度,树中结点的个数,值为data的结点所在的层数

时间:2023-01-09 08:20:44

#include<iostream>
#include<cstdio>
#include<malloc.h>


#define OVERFLOW -2


typedef struct BiTNode{
    char data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;


void CreateBiTree(BiTree &L){
    char ch;
    scanf("%c",&ch);
    if(ch=='#')L=NULL;
    else{
        L=(BiTree)malloc(sizeof(BiTNode));
        if(!L)exit(OVERFLOW);
        L->data=ch;
        CreateBiTree(L->lchild);
        CreateBiTree(L->rchild);
    }
}


void PreOrderTraverse(BiTree L){
    if(L){
        printf("%c",L->data);
        PreOrderTraverse(L->lchild);
        PreOrderTraverse(L->rchild);
    }
}
void PostOrderTraverse(BiTree L){
    if(L){
        PostOrderTraverse(L->lchild);
        PostOrderTraverse(L->rchild);
        printf("%c",L->data);
    }
}


void InOrderTraverse(BiTree L){
    if(L){
        InOrderTraverse(L->lchild);
        printf("%c",L->data);
        InOrderTraverse(L->rchild);
    }
}


int Depth(BiTree L){
    int d1,d2,d3;
    if(!L)d1=0;
    else{
        d2=Depth(L->lchild);
        d3=Depth(L->rchild);
        d1=1+(d2>d3?d2:d3);
    }
    return d1;
}
int Leaf(BiTree L,int &c){
    if(L!=NULL){//在树不为空的时候才能讨论左右结点
        if(L->lchild==NULL&&L->rchild==NULL)c++;
        Leaf(L->lchild,c);
        Leaf(L->rchild,c);
    }
    return c;
}
void GetFloor(BiTree L,char data,int floor,int &res){
    if(L!=NULL){
        if(L->data==data){
            res=floor;
        }
        GetFloor(L->lchild,data,floor+1,res);
        GetFloor(L->rchild,data,floor+1,res);
    }
}
int c=0;
void Count(BiTree L){
    if(L!=NULL){
        c++;
        Count(L->lchild);
        Count(L->rchild);
    }
}
int main(){
    BiTree T;
    CreateBiTree(T);
    printf("先序遍历序列为:\n");
    PreOrderTraverse(T);
    printf("\n中序遍历序列为:\n");
    InOrderTraverse(T);
    printf("\n后序遍历序列为:\n");
    PostOrderTraverse(T);
    printf("\n高度:%d\n",Depth(T));
    int m=0;
    Leaf(T,m);
    printf("叶子数:%d\n",m);
    int floor=1,res;
    GetFloor(T,'D',floor,res);
    printf("在第%d层\n",res);
    Count(T);
    printf("一共有%d个结点\n",c);
}


二叉树的创建(先序)先序中序后序遍历(递归算法),求叶子结点个数,求树的高度,树中结点的个数,值为data的结点所在的层数