Archived
1
0
This repository has been archived on 2026-03-24. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
SomeLab/shiyan3/作业7.cpp
2025-11-15 20:25:57 +08:00

159 lines
3.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include<stdio.h>
#include<stdlib.h>
typedef struct Tree {
char data;
struct Tree *lchild;
struct Tree *rchild;
} Tree;
// 初始化树
void initTree(Tree *T) {
T->lchild = NULL;
T->rchild = NULL;
T->data = '0';
}
// 创建树
void CreateTree(Tree* T) {
int n = 0, m = 0, i = 0;
if (T->data == '0') {
printf("请输入该子树根节点的数据:");
//getchar();
//char x;
scanf_s("%c", &T->data);
getchar();
}
printf("节点%c是否有左子树0没有1:", T->data);
scanf_s("%d", &n);
getchar();
if (n == 1) {
Tree* lchild = (Tree*)malloc(sizeof(Tree));
T->lchild = lchild;
lchild->lchild = NULL;
lchild->rchild = NULL;
lchild->data = '0';
CreateTree(T->lchild);
printf("该节点%c是否存在右子树0没有 1", T->data);
scanf_s("%d", &i);
getchar();
if (i == 1) {
Tree* rchild = (Tree*)malloc(sizeof(Tree));
T->rchild = rchild;
rchild->lchild = NULL;
rchild->rchild = NULL;
rchild->data = '0';
CreateTree(T->rchild);
}
}
else if (n == 0) {
printf("节点%c是否有右子树0没有1:", T->data);
scanf_s("%d", &m);
getchar();
if (m == 1) {
Tree* rchild = (Tree*)malloc(sizeof(Tree));
T->rchild = rchild;
rchild->lchild = NULL;
rchild->rchild = NULL;
rchild->data = '0';
CreateTree(T->rchild);
}
}
}
// 中序遍历
void LDR(Tree *T) {
if (T != NULL) {
LDR(T->lchild);
printf("%c ", T->data);
LDR(T->rchild);
}
}
// 先序遍历
void DLR(Tree *T) {
if (T != NULL) {
printf("%c ", T->data);
DLR(T->lchild);
DLR(T->rchild);
}
}
// 后序遍历
void LRD(Tree *T) {
if (T != NULL) {
LRD(T->lchild);
LRD(T->rchild);
printf("%c ", T->data);
}
}
// 计算叶子节点个数
int leaves(Tree *T) {
int count = 0;
if (T == NULL) {
return 0;
}
if (T->lchild == NULL && T->rchild == NULL) {
count ++;
} else {
return leaves(T->lchild) + leaves(T->rchild);
}
return count;
}
// 计算树的深度
int depth(Tree *T) {
int ldepth = 0, rdepth = 0;
if (T == NULL) {
return 0;
} else {
ldepth = depth(T->lchild);
rdepth = depth(T->rchild);
return (ldepth > rdepth) ? (ldepth + 1) : (rdepth + 1);
}
}
// 计算树的节点个数
int nodes(Tree *T) {
if (T == NULL) {
return 0;
} else {
return nodes(T->lchild) + nodes(T->rchild) + 1;
}
}
// 计算度为2的节点个数
int degree2nodes(Tree *T) {
int count = 0;
if (T == NULL) {
return 0;
}
if (T->lchild != NULL && T->rchild != NULL) {
count ++;
}
return count + degree2nodes(T->lchild) + degree2nodes(T->rchild);
}
int main() {
Tree bss;
initTree(&bss);
CreateTree(&bss);
printf("中序遍历结果为:\n");
LDR(&bss);
printf("\n先序遍历结果为:\n");
DLR(&bss);
printf("\n后序遍历结果为:\n");
LRD(&bss);
printf("\n叶子节点个数为:%d\n", leaves(&bss));
printf("树的深度为:%d\n", depth(&bss));
printf("树的节点个数为:%d\n", nodes(&bss));
printf("度为2的节点个数为%d\n", degree2nodes(&bss));
return 0;
}