1. 实验目的
(1)能实现二叉树链式存储结构下的创建及遍历算法;
(2)能根据实际问题,设计二叉树存储结构并设计相应算法。
2. 实验内容
(1)第一关:二叉树链式存储结构设计及二叉树创建和遍历算法;
(2)第二关:实现二叉树中树叶结点计数
(3)第三关:实现二叉树左右子树互换算法;
第一关:
任务描述
本关任务:完成二叉树的创建及遍历输出。
相关知识
为了完成本关任务,你需要掌握:
如何创建一棵二叉树;
如何遍历二叉树并输出。
编程要求
根据提示,在右侧编辑器Begin-End处补充代码,完成创建一棵二叉树,并输出该二叉树的先根、中根、后根遍历结果。
测试说明
平台会对你编写的代码进行测试:
测试输入:ABD###CE#G##FH##I##; 预期输出: A B D C E G F H I D B A E G C H F J D B G E H I F C A
测试输入:AB##CE#G###; 预期输出: A B C E G B A E G C B G E C A
#include <stdio.h>
#include <stdlib.h>
#define error 0
#define ok 1
//二叉树结点定义
typedef struct tree{
char data;
struct tree *lc;
struct tree *rc;
}btree,*treeptr;
//创建二叉树
int createtree(treeptr (*T))
{
char c;
scanf("%c",&c);
if(c == '#')
{
*T = NULL;
return error;
}
(*T) = (treeptr)malloc(sizeof(btree)) ;
(*T)->data = c;
createtree(&(*T)->lc);
createtree(&(*T)->rc);
}
//先根遍历
int preprint(treeptr T)
{
if(T == NULL)
return error;
printf("%c",T->data);
preprint(T->lc);
preprint(T->rc);
}
//中根遍历
int midprint(treeptr T)
{
if(T == NULL)
return error;
midprint(T->lc);
printf("%c",T->data);
midprint(T->rc);
}
//后根遍历
int lprint(treeptr T)
{
if(T == NULL)
return error;
lprint(T->lc);
lprint(T->rc);
printf("%c",T->data);
}
int main()
{
treeptr tree;
printf("请输入一个二叉树:\n");
createtree(&tree);
printf("先根遍历:");
preprint(tree);
printf("\n中根遍历:");
midprint(tree);
printf("\n后根遍历:");
lprint(tree);
return 0;
}
第二关:
任务描述
统计二叉树的叶子结点个数。 (1)输入二叉树的先根序序列,构造二叉树 (2)输出所构造的二叉树的叶子个数
相关知识(略)
编程要求
根据提示,在右侧编辑器Begin-End处补充代码,完成本关任务。
测试说明
平台会对你编写的代码进行测试:
测试输入(注意#是特殊的字符,并不会被插入二叉树中):ABC##D##E#F#G## 预期输出:3
测试输入:eba###f## 预期输出:2
#include <iostream>
using namespace std;
typedef char DataType;
//二叉树数据结构
struct node
{
DataType info ; //存放结点数据
struct node *lchild , *rchild ; //指向左右孩子的指针
};
typedef struct node *BiTree ;
//创建二叉树
BiTree createBiTree(void)
{
char ch ;
BiTree root ;
cin>>ch ;
if(ch == '#') root = NULL;
else{
root = new struct node ;
root->info = ch ;
root->lchild = createBiTree() ;
root->rchild = createBiTree();
}
return root ;
}
void visit(BiTree T)
{
cout<<T->info ;
}
int countLeaf(BiTree root)
{
if(root==NULL)return 0;
if(root->lchild==NULL&&root->rchild==NULL)return 1;
else return countLeaf(root->lchild)+countLeaf(root->rchild);
}
int main(void)
{ printf("请输入一个二叉树:\n");
BiTree root = createBiTree();
printf("二叉树的叶子个数:");
cout<<countLeaf(root);
}
第三关:
任务描述
本关任务:二叉树左右子树互换。
提示
可以使用递归完成,递归需要明白递归结束条件 如果结点不为NULL,则交换左右子树(用递归即可)
编程要求
根据提示,在右侧编辑器完整实现要求。
测试说明
平台会对你编写的代码进行测试:
测试输入(树的先根序,具体二叉树见上):12#5#6##3#4## 预期输出(转换后二叉树的先根序遍历序列):134256
#include <iostream>
using namespace std;
typedef char DataType;
//二叉树数据结构
struct node
{
DataType info ; //存放结点数据
struct node *lchild , *rchild ; //指向左右孩子的指针
};
typedef struct node *BiTree ;
//创建二叉树
BiTree createBiTree(void)
{
char ch ;
BiTree root ;
cin>>ch ;
if(ch == '#') root = NULL;
else{
root = new struct node ;
root->info = ch ;
root->lchild = createBiTree() ;
root->rchild = createBiTree();
}
return root ;
}
//二叉树左右子树互换
void changeLR(BiTree root)
{
BiTree temp = NULL;
if(root){
temp = root-> lchild;
root -> lchild = root ->rchild;
root->rchild = temp;
changeLR(root->lchild);
changeLR(root->rchild);
}
}
//输出结点的数据
void visit(BiTree T)
{
cout<<T->info ;
}
//先根遍历
void PreOrder(BiTree root)
{
if(root == NULL) return ;
visit(root);
PreOrder(root->lchild);
PreOrder(root->rchild);
}
int main(void)
{ printf("请输入一个二叉树:\n");
BiTree root = createBiTree();
changeLR(root);
printf("转换后二叉树的先根序遍历序列:\n");
PreOrder(root);
}