#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);
}
}
}
PTA 第六章 二叉树的遍历(中序遍历、前序遍历、后序遍历、层序遍历)、求深度、前序输出叶子结点
最新推荐文章于 2022-12-04 17:07:14 发布