#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 128
#define STR_SIZE 1024
typedef struct Node { // 定义二叉链
char data; // 数据元素
struct Node* lchild; // 指向左孩子节点
struct Node* rchild; // 指向右孩子节点
} BTNode;
typedef struct Quene { // 定义顺序队
int front; // 队头指针
int rear; // 队尾指针
BTNode* data[MAX_SIZE]; // 存放队中元素
} SqQueue;
//队列函数
void initQueue(SqQueue** q); // 初始化队列
bool emptyQueue(SqQueue* q); // 判断队列空
bool enQueue(SqQueue* q, BTNode* node); // 入队
bool deQueue(SqQueue* q, BTNode** node); // 出队
//二叉树函数
void createBTNode2(BTNode** BT); // 创建二叉树
int createBTNode(BTNode** BT, char* str, int n); // 创建二叉树
void preOrder(BTNode* BT); // 前序遍历
void inOrder(BTNode* BT); // 中序遍历
void postOrder(BTNode* BT); // 后序遍历
void levelOrder(BTNode* BT); // 层次遍历
void levelOrder(BTNode* BT) {
SqQueue* q; // 定义队列
initQueue(&q); // 初始化队列
if (BT != NULL) { // 根节点指针进队列
enQueue(q, BT);
}
// 一层一层的把节点存入队列,当没有孩子节点时就不再循环
while (!emptyQueue(q)) { // 队不为空循环
deQueue(q, &BT); // 出队时的节点
printf("%c", BT->data); // 输出节点存储的值
if (BT->lchild != NULL) { // 有左孩子时将该节点进队列
enQueue(q, BT->lchild);
}
if (BT->rchild != NULL) { // 有右孩子时将该节点进队列
enQueue(q, BT->rchild);
}
}
}
//叶子节点数
int countleaf(BTNode* BT,int &sum){
if(BT)
{
if(BT->lchild==NULL && BT->rchild==NULL)
sum++;
countleaf(BT->lchild,sum);
countleaf(BT->rchild,sum);
}
return sum;
}
//树深算法
int TreeDeep(BTNode* BT)
{
int deep=0;
if(BT)
{
int leftdeep=TreeDeep(BT->lchild);
int rightdeep=TreeDeep(BT->rchild);
deep=leftdeep>=rightdeep?leftdeep+1:rightdeep+1;
}
return deep;
}
//统