PTA 第六章 二叉树的遍历(中序遍历、前序遍历、后序遍历、层序遍历)、求深度、前序输出叶子结点

#include <bits/stdc++.h>

typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

BinTree CreatBinTree(); /* 实现细节忽略 */
int GetHeight( BinTree BT );  //求深度的函数
void InorderTraversal( BinTree BT );//中序遍历函数
void PreorderTraversal( BinTree BT );//前序遍历函数
void PostorderTraversal( BinTree BT );//后序遍历函数
void LevelorderTraversal( BinTree BT );//层序遍历函数
void PreorderPrintLeaves( BinTree BT );//前序输出叶子结点

int main()
{
    BinTree BT = CreatBinTree();
    printf("%d\n", GetHeight(BT));
    printf("Inorder:");    InorderTraversal(BT);    printf("\n");
    printf("Preorder:");   PreorderTraversal(BT);   printf("\n");
    printf("Postorder:");  PostorderTraversal(BT);  printf("\n");
    printf("Levelorder:"); LevelorderTraversal(BT); printf("\n");
    printf("Leaf nodes are:");
    PreorderPrintLeaves(BT);
    printf("\n");

    return 0;
}
/* 你的代码将被嵌在这里 */
BinTree CreatBinTree()//前序创建二叉树
{
    char c;					//创建二叉树
    TNode *t;
    scanf("%c",&c);
    //getchar();
    if(c==' ')			//如果输入的为空格,将该结点置为空
        return NULL;
    else{              //否则将字符c赋值给该节点,并递归创建该节点的左孩子,右孩子
        t=(TNode *)malloc(sizeof(TNode));
        t->Data=c;
        t->Left=CreatBinTree();
        t->Right=CreatBinTree();
    }
    return t;
}

int GetHeight( BinTree BT )//求深度(后序)
{						//算法概述,依此递归左右子树,递归到叶子结点
    int deep=0;		//然后开始返回,每次返回表示深度的变量+1,
    int ldeep;		//递归回第一层是,比较左右子树的深度,取最大值
    int rdeep;		//为整个二叉树的深度,返回该值。
    if(BT==NULL)
        return 0;
    else{
        ldeep=GetHeight(BT->Left);
        rdeep=GetHeight(BT->Right);
    }
    if(ldeep>rdeep)
        deep=ldeep+1;
    else
        deep=rdeep+1;
    return deep;
}

void InorderTraversal(BinTree BT)
{
    if(!BT)
        return;
    else{
        InorderTraversal(BT->Left);
        printf(" %c",BT->Data);
        InorderTraversal(BT->Right);
    }
}

void PreorderTraversal( BinTree BT )
{
    if(!BT)
        return;
     else{

        printf(" %c",BT->Data);
        PreorderTraversal(BT->Left);
        PreorderTraversal(BT->Right);
    }
}

int flag3=0;
void PostorderTraversal( BinTree BT)
{
    if(!BT)
        return;
    else{
        PostorderTraversal(BT->Left);
        PostorderTraversal(BT->Right);
        printf(" %c",BT->Data);
    }
}

//算法概述:创建一个数组将根节点存入数组中,设置两个变量,一个表示数组
//的长度,一个表示当前位置,然后开始向下遍历,将当前位置的节点输出,而
 /后表示当前节点位置的数后移一位,直到两个变量相等,输出后,当前节点若
//有左子树,将左子树存入数组中,若有右子树,再将右子树存入数组中
//
void LevelorderTraversal(BinTree BT)//层序遍历
{
    BinTree q[100];
    BinTree t;
    int base=0;
    int head=0;
    if(BT)
    {
        q[head++]=BT;
        while(base!=head)
        {
            t=q[base++];
            printf(" %c",t->Data);
            if(t->Left)
            {
                q[head++]=t->Left;
            }
            if(t->Right)
            {
                q[head++]=t->Right;
            }
        }
    }
}

void PreorderPrintLeaves( BinTree BT )//前序输出叶子结点
{
    if(!BT)
        return;
    else{
        if(BT->Left==NULL&&BT->Right==NULL)//如果当前结点是叶子结点则输出。
            printf(" %c",BT->Data);
        else       //如果当前结点不是叶子结点,递归遍历左右子树
        {
            PreorderPrintLeaves(BT->Left);
            PreorderPrintLeaves(BT->Right);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值