#include<stdio.h>
#include<stdlib.h>
typedef struct node {
int data;
struct node* left;
struct node* right;
}node;//树结构定义
typedef struct queue {
node** data;
int tail, head;
}queue;//队列结构定义
node* popqueue(queue* q) {
if (q == NULL) return NULL;
return q->data[q->head++];
}//出队一个队列元素
int pushqueue(queue* q, node* n) {
if (q == NULL) return 0;
q->data[q->tail++] = n;
return 1;
}//入队一个队列元素,0,1代表是否入队成功
int isempty(queue* q) {
if (q == NULL) return 1;
if (q->head == q->tail) return 1;
return 0;
}//队列判空操作
queue* getnewqueue(int n) {
queue* q = (queue*)malloc(sizeof(queue));
q->data = (node**)malloc(sizeof(node*) * n);
q->head = q->tail = 0;
return q;
}//创造一个队列大小为n的队列
node* getNewTree(int data) {
node* tree = (node*)malloc(sizeof(node));
tree->data = data;
tree->left = tree->right = NULL;
return tree;
}//创建一个树结点
void front(node* root) {
if (root == NULL) return;
printf("%d ", root->data);
front(root->left);
front(root->right);
}//前序遍历
void mid(node* root) {
if (root == NULL) return;
mid(root->left);
printf("%d ", root->data);
mid(root->right);
}//中序遍历
void before(node* root) {
if (root == NULL) return;
before(root->left);
before(root->right);
printf("%d ", root->data);
}//后序遍历
void bfs(node* root) {
queue* q = getnewqueue(100);
q->data[q->tail++] = root;
while (q->head < q->tail) {
node* tree = q->data[q->head];
if (tree->left != NULL) q->data[q->tail++] = tree->left;
if (tree->right != NULL) q->data[q->tail++] = tree->right;
printf("%d ", tree->data);
q->head++;
}
}//层度遍历
void printLeaves(node* root) {
if (root == NULL)
return;
if (root->left == NULL && root->right == NULL)
printf("%d ", root->data);
printLeaves(root->left);
printLeaves(root->right);
}//打印叶子结点
int GetHeight(node* root) {
int hl, hr, maxh;
if (root == NULL) return 0;
hl = GetHeight(root->left);
hr = GetHeight(root->right);
maxh = hl > hr ? hl : hr;
return maxh + 1;
}//求树的高度
node* maketree() {
int data;
node* tool, * tree;
queue* q = getnewqueue(100);
scanf("%d", &data);
if (data) {
tool = (node*)malloc(sizeof(node));
tool->data = data;
tool->left = NULL;
tool->right = NULL;
pushqueue(q, tool);
}
else return NULL;
while (!isempty(q)) {
tree = popqueue(q);
scanf("%d", &data);
if (data == 0) tree->left = NULL;
else {
tree->left = (node*)malloc(sizeof(node));
tree->left->data = data;
pushqueue(q, tree->left);
}
scanf("%d", &data);
if (data == 0) tree->right = NULL;
else {
tree->right = (node*)malloc(sizeof(node));
tree->right->data = data;
pushqueue(q, tree->right);
}
}
return tool;
}//创建一颗完整的二叉树
int main() {
node* root = (node*)malloc(sizeof(node));
printf("请输入树的结点:");
root = maketree();
printf("前序遍列结果是:\n");
front(root);
printf("\n");
printf("中序遍列结果是:\n");
mid(root);
printf("\n");
printf("后序遍列结果是:\n");
before(root);
printf("\n");
printf("层序遍历结果是:\n");
bfs(root);
printf("\n");
printf("叶子结点是:\n");
printLeaves(root);
printf("\n");
printf("树的高度为:\n");
int height = GetHeight(root);
printf("%d", height);
return 0;
}
二叉树的遍历,叶子结点,树高
最新推荐文章于 2024-06-11 13:58:52 发布