数据与结构实验四:二叉树的建立、遍历及应用

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);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值