引言
- 文章结构:每题是由题目、解析与注意事项和代码三部分组成。在文章的结尾,记录了我的一些做题心得。
- 建议第一次写这些题目的同学可以自己先敲一下代码,然后再参考文章中的代码。
- 码字不易,如果这篇文章对您有帮助的话,希望您能点赞、评论、收藏,投币、转发、关注。您的鼓励就是我前进的动力!
第一题
题目
题目描述
熟悉二叉树的二叉链表存储结构。掌握二叉树每一种操作的具体实现。学会利用递归方法编写对二叉树这种递归结构进行处理的算法。
输入
构造一个二叉树,输入多行数字,每一行的含义如下:
输入1,代表先序创建二叉树。按先序次序输入,以#字符表示空树
输入2,代表先序递归遍历二叉树。
输入3,代表中序递归遍历二叉树。
输入4,代表后序递归遍历二叉树。
输入5,代表求二叉树的深度。
输入6,代表求二叉树的叶子结点个数。
输入7,代表求二叉树的结点总数。
输入0,代表退出。
输出
根据输入的不同数值和含义,输出所有答案。
样例输入 Copy
1
AB#C##D##
2
3
4
5
6
7
0
样例输出 Copy
A B C D
B C A D
C B D A
3
2
4
解析与注意事项
- 求二叉树深度,判断树是否为空时,不能直接「 if(T) 」,否则会导致函数没有返回值。要在判断树为空时,返回0,保证函数有返回值。
- 计算叶子数和节点数时,要用全局变量 LEAFCOUNT 和 NODECOUNT ,因为该变量不仅在函数中要使用,在主函数中也要使用。
- 注意先、中、后序遍历的英文缩写(PreOrder,InOrder,PostOrder),要规范。
代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef char ElemType; //定义二叉树结点值的类型为字符型
int LEAFCOUNT = 0;
int NODECOUNT = 0;
typedef struct BiTNode
{
///===============补充代码========================
ElemType data;
struct BiTNode * lchild, * rchild;
}BiTNode, * BiTree;
void CreateBiTree(BiTree& T)//按先序次序输入,以"#"表示空树
{
///===============补充代码========================
char ch;
scanf("%c", &ch);
if (ch == '#')
T = NULL;
else {//用递归的方法,先根遍历建立二叉树
if (!(T = (BiTNode*)malloc(sizeof(BiTNode))))exit(1);//动态分配存储空间,失败则退出
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void PreOrderTraverse(BiTree T)//先序遍历
{
///===============补充代码========================
if (T) {
printf("%c ",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(BiTree T)//中序遍历
{
///===============补充代码========================
if (T) {
InOrderTraverse(T->lchild);
printf("%c ", T->data);
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T)//后序遍历
{
///===============补充代码========================
if (T) {
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c ", T->data);
}
}
int BTDepth(BiTree T)//求二叉树的深度
{
///===============补充代码========================
int a, b;
if (!T)
return 0;
else
//不能直接if(T)
{
a = BTDepth(T->lchild);
b = BTDepth(T->rchild);
return (a > b ? a : b)+1;
}
}
void Leaf(BiTree T)//求二叉树的叶子数, 使用全局变量
{
///===============补充代码========================
if(T)
{
if (T->lchild == NULL && T->rchild == NULL)
LEAFCOUNT++;//全局变量
Leaf(T->lchild);
Leaf(T->rchild);
}
}
void NodeCount(BiTree T)//求二叉树的结点总数, 使用全局变量
{
///===============补充代码========================
if(T)
{
NODECOUNT++;//全局变量
NodeCount(T->lchild);
NodeCount(T->rchild);
}
}
int main()
{
BiTree T = NULL;
int select;
while (scanf("%d", &select) != EOF)
{
switch (select)
{
case 0:
return 0;
case 1:
getchar();
CreateBiTree(T);
break;
case 2:
if (T) {
PreOrderTraverse(T);
printf("\n");
}
break;
case 3:
if (T) {
InOrderTraverse(T);
printf("\n");
}
break;
case 4:
if (T) {
PostOrderTraverse(T);
printf("\n");
}
break;
case 5:
printf("%d\n", BTDepth(T));
break;
case 6:
LEAFCOUNT = 0;
Leaf(T);
printf("%d\n", LEAFCOUNT);
break;
case 7:
NODECOUNT = 0;
NodeCount(T);
printf("%d\n", NODECOUNT);
break;
}
}
return 0;
}
做题心得
- 写题时注意看函数的返回值类型和参数列表,切忌粗心大意。