一、题目描述
编写程序实现二叉树的如下操作:
1) 建立二叉链表
2) 二叉树的先序、中序、后序遍历
3) 求二叉树的叶子结点个数
4) 将二叉树中所有结点的左、右子树相互交换输入:
扩展二叉树先序序列:ab#d##ce###。其中#代表空指针。输出:
二叉树的凹入表示
二叉树的先序序列、中序序列、后序序列
二叉树叶子结点个数
左、右子树相互交换后的二叉树的凹入表示
左、右子树相互交换后的二叉树的先序序列、中序序列、后序序列。说明:
在输出凹入表示的二叉树时,先输出根结点,然后依次输出左右子树,上下层结点之间相隔 3 个空格。
测试输入 期待的输出 时间限制 内存限制 额外进程 测试用例 1 以文本方式显示
- ab#d##ce###↵
以文本方式显示
- BiTree↵
- a↵
- b↵
- d↵
- c↵
- e↵
- pre_sequence : abdce↵
- in_sequence : bdaec↵
- post_sequence : dbeca↵
- Number of leaf: 2↵
- BiTree swapped↵
- a↵
- c↵
- e↵
- b↵
- d↵
- pre_sequence : acebd↵
- in_sequence : ceadb↵
- post_sequence : ecdba↵
1秒 64M 0 测试用例 2 以文本方式显示
- abd##e##cf##g##↵
以文本方式显示
- BiTree↵
- a↵
- b↵
- d↵
- e↵
- c↵
- f↵
- g↵
- pre_sequence : abdecfg↵
- in_sequence : dbeafcg↵
- post_sequence : debfgca↵
- Number of leaf: 4↵
- BiTree swapped↵
- a↵
- c↵
- g↵
- f↵
- b↵
- e↵
- d↵
- pre_sequence : acgfbed↵
- in_sequence : gcfaebd↵
- post_sequence : gfcedba↵
1秒 64M 0
二、完整代码
#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
//二叉树的存储表示
typedef struct BiTNode
{
char data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode, *BiTree;
queue<BiTree>q; //辅助队列
int counts = 0; //统计叶子结点数目
void createBiTree(); //建立二叉树
void visit(BiTree R); //访问结点
void print(BiTree R, int n); //输出二叉树
void pre_sequence(BiTree R); //先序遍历
void in_sequence(BiTree R); //中序遍历
void post_sequence(BiTree R); //后序遍历
/* 左右子树交换后的各种表示 */
void swap_print(BiTree R, int n);
void swap_pre_sequence(BiTree R);
void swap_in_sequence(BiTree R);
void swap_post_sequence(BiTree R);
int main()
{
BiTree bit;
bit = (BiTree)malloc(sizeof(BiTNode));
q.push(bit);
//建树
createBiTree();
//打印二叉树
printf("BiTree\n");
print(bit, 0);
//先序
printf("pre_sequence : ");
pre_sequence(bit);
printf("\n");
//中序
printf("in_sequence : ");
in_sequence(bit);
printf("\n");
//后序
printf("post_sequence : ");
post_sequence(bit);
printf("\n");
//叶子结点数目
printf("Number of leaf: %d\n", counts);
/* 翻转 */
printf("BiTree swapped\n");
swap_print(bit, 0);
printf("pre_sequence : ");
swap_pre_sequence(bit);
printf("\n");
printf("in_sequence : ");
swap_in_sequence(bit);
printf("\n");
printf("post_sequence : ");
swap_post_sequence(bit);
printf("\n");
return 0;
}
void createBiTree()
{
char c;
BiTree T, N;
while (!q.empty())
{
scanf("%c", &c);
if (c == '\n') //换行符结束读取
break;
T = q.front();
q.pop();
T->data = c; //结点赋值
if (c!='#') {
//建立左子树
N = (BiTree)malloc(sizeof(BiTNode));
T->lchild = N;
q.push(N);
createBiTree();
//建立右子树
N = (BiTree)malloc(sizeof(BiTNode));
T->rchild = N;
q.push(N);
createBiTree();
}
}
}
void visit(BiTree R)
{
//结点不为空则输出
if (R->data != '#'&&R->data != '\0')
cout << R->data;
}
void print(BiTree R, int n)
{
if (R->data != '#'&&R->data != '\0')
{
int i = 1;
while (i <= n) //第几层就输几个tab
{
cout << " ";
i++;
}
visit(R);
cout << endl;
//一层一层往下找
n++;
print(R->lchild, n);
print(R->rchild, n);
}
}
void pre_sequence(BiTree R)
{
if (R->data != '#'&&R->data != '\0')
{
visit(R);
pre_sequence(R->lchild);
pre_sequence(R->rchild);
}
}
void in_sequence(BiTree R)
{
if (R->data != '#'&&R->data != '\0')
{
in_sequence(R->lchild);
/* 统计叶子结点和中序遍历结合 */
if ((R->lchild->data == '#' || R->lchild->data == '\0') && (R->rchild->data == '#' || R->rchild->data == '\0'))
counts++;
visit(R);
in_sequence(R->rchild);
}
}
void post_sequence(BiTree R)
{
if (R->data != '#'&&R->data != '\0')
{
post_sequence(R->lchild);
post_sequence(R->rchild);
visit(R);
}
}
void swap_print(BiTree R, int n)
{
//翻转后的写法与原来一模一样,只是换了顺序而已
if (R->data != '#'&&R->data != '\0')
{
int i = 1;
while (i <= n)
{
cout << " ";
i++;
}
visit(R);
cout << endl;
n++;
swap_print(R->rchild, n);
swap_print(R->lchild, n);
}
}
void swap_pre_sequence(BiTree R)
{
if (R->data != '#'&&R->data != '\0')
{
visit(R);
swap_pre_sequence(R->rchild);
swap_pre_sequence(R->lchild);
}
}
void swap_in_sequence(BiTree R)
{
if (R->data != '#'&&R->data != '\0')
{
swap_in_sequence(R->rchild);
visit(R);
swap_in_sequence(R->lchild);
}
}
void swap_post_sequence(BiTree R)
{
if (R->data != '#'&&R->data != '\0')
{
swap_post_sequence(R->rchild);
swap_post_sequence(R->lchild);
visit(R);
}
}
三、说明
是一个和我一个专业的学长/学姐呀
ta的这篇博文是20年写的,用在22年的题目已经不太适用,我稍微改了函数createBiTree()的一些代码,现在的更新后代码可以全部AC√