早教吧 育儿知识 作业答案 考试题库 百科 知识分享

二叉树的遍历操作实现二.实验内容与要求1.建立二叉树二叉链存贮结构。2.根据二叉树的括号表示方法,建立一棵二叉树。3.根据建立的二叉树的二叉链存贮结构,进行二叉树的遍历,输

题目详情
二叉树的遍历操作实现
二. 实验内容与要求
1.建立二叉树二叉链存贮结构。
2. 根据二叉树的括号表示方法,建立一棵二叉树。
3. 根据建立的二叉树的二叉链存贮结构,进行二叉树的遍历,输出相应序列。
4. 对建立的二叉树求其叶子结点数、度为2的结点数、求树的高度、以括号表示法输出二叉树。
没人知道啊
▼优质解答
答案和解析
// S_lbecs.cpp : 定义控制台应用程序的入口点。
//链表二叉树的定义和操作
#include "stdafx.h"
#include "stdio.h"
#include "malloc.h"
#include "string.h"
#include "stdlib.h"
#define Max 20 //最大节点个数
typedef struct node{
char data;
struct node *lchild,*rchild; //左边孩子的指针 和 右边孩子的指针
}BinTNode;
typedef BinTNode *BinTree; //定义二叉树的指针
int NodeNum,leaf; //NodeNum是结点数 leaf是叶子数
//基于先序遍历算法创建二叉树
//要求输入先序序列,其中加入虚结点“#”以示空指针的位置
BinTree CreatBinTree(void){
BinTree T;
char ch;
scanf("%c",&ch);
if(ch=='#') //读入# 返回空指针
return(NULL);
else{
T=(BinTNode *)malloc(sizeof(BinTNode)); //生成结点
T->data=ch;
T->lchild=CreatBinTree(); //构造左子树
T->rchild=CreatBinTree(); //构造右子树
return(T);
}
}
//DLR 先序遍历
//访问根节点 先序遍历左子树 先序遍历右子树
void Preorde(BinTree T){
if(T){
printf("%c",T->data); //访问结点 D
Preorde(T->lchild); //先序遍历左子树 L
Preorde(T->rchild); //先序遍历右子树 R
}
}
//LDR 中序遍历
void Inorder(BinTree T){
if(T){
Inorder(T->lchild); //中序遍历左子树 L
printf("%c",T->data); //访问结点 D
Inorder(T->rchild); //中序遍历右子树 R
}
}
//LRD 后序遍历
void Postorder(BinTree T){
if(T){
Postorder(T->lchild); //后序遍历左子树 L
Postorder(T->rchild); //后序遍历右子树 R
printf("%c",T->data); //访问结点 D
}
}
//采用后序遍历求二叉树的深度、结点数及叶子数的递归算法
int TreeDepth(BinTree T){
int hl,hr,max;
if(T){
hl=TreeDepth(T->lchild); //求左深度
hr=TreeDepth(T->rchild); //求右深度
max=hl>hr?hl:hr; //取最大深度
NodeNum=NodeNum+1; //求结点数
if(hl==0&&hr==0) //若左右深度都为0 则为叶子
leaf=leaf+1;
return(max+1);
}else{
return(0);
}
}
//利用“先进先出”(FIFO)队列,按层次遍历二叉树
void Levelorder(BinTree T){
int front=0,rear=1;
BinTNode *cq[Max],*p; //定义结点的指针数组cq
cq[1]=T; //根入队
while(front!=rear){
front=(front+1)%NodeNum;
p=cq[front]; //出队
printf("%c",p->data); //输出结点的值
if(p->lchild!=NULL){
rear=(rear+1)%NodeNum;
cq[rear]=p->lchild; //左子树入队
}
if(p->rchild!=NULL){
rear=(rear+1)%NodeNum;
cq[rear]=p->rchild; //右子树入队
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
BinTree root;
int i,depth; //最大深度
printf("\n创建二叉树;输入完全二叉树先序序列:");
//用#代表虚结点 如ABD###CE##F##
root=CreatBinTree(); //创建二叉树 返回根结点
printf("\n创建成功!\n");
do{ //从菜单中选择遍历方式,输入序号。
printf("\t********** select ************\n");
printf("\t1: 先序遍历\n");
printf("\t2: 中序遍历\n");
printf("\t3: 后序遍历\n");
printf("\t4: 求树的深度及叶子数\n");
printf("\t5: 按层次遍历\n"); //按层次遍历之前,先选择4,求出该树的结点数。
printf("\t0: 退出\n");
printf("\t*******************************\n请选择:");
scanf("%d",&i); //输入菜单选项 0-5
switch(i){
case 1:
//1: 先序遍历 Preorde
printf("先序遍历的结果是");
Preorde(root); //
printf("\n");
break;
case 2:
//2: 中序遍历 Inorder
printf("中序遍历的结果是");
Inorder(root); //
printf("\n");
break;
case 3:
//3: 后序遍历 Postorder
printf("后序遍历的结果是");
Postorder(root); //
printf("\n");
break;
case 4:
//4: 求树的深度及叶子数 TreeDepth
depth=TreeDepth(root); //
printf("数的深度=%d 结点数=%d",depth,NodeNum);
printf(" 叶子数=%d",leaf);
printf("\n");
break;
case 5:
//5: 按层次遍历 Preorde
printf("按层次遍历的结果是");
Levelorder(root); //
printf("\n");
break;
default:
printf("输入错误\n");
break;
}

}while(i!=0);
return 0;
}
是vs做的 有些地方需要改下 是C语言做的
看了 二叉树的遍历操作实现二.实验...的网友还看了以下:

下面是玉米种子结构图及玉米某些生理活动示意图(图乙中的①-⑥表示结构,图二中的A、B、C表示生理过  2020-05-13 …

以下()不是数据结构研究的内容。I.数据的运算 II.数据的逻辑结构 Ⅲ.数据的存储结构 IV.数据  2020-05-23 …

_________不是数据结构研究的内容。Ⅰ.数据的采集Ⅱ.数据的逻辑组织Ⅲ.数据的存储结构Ⅳ.数据  2020-05-23 …

下列哪些是数据结构研究的内容?() Ⅰ. 数据的存储结构 Ⅱ. 数据的逻辑结构Ⅲ. 数据的传输结构  2020-05-24 …

数据结构概论二、判断对错题:(每题2分,共40分,正确的选A,错误的选B)1.\x05数据的逻辑结  2020-06-28 …

二叉树的遍历操作实现二.实验内容与要求1.建立二叉树二叉链存贮结构。2.根据二叉树的括号表示方法,  2020-07-16 …

C语言选择结构输入三个数,判断能否构成三角形,如可以则求其面积并输出,否则输出不能构成三角形的提示信  2020-11-03 …

准备不少于10个的邮政编码,设计一棵二叉树,高度不少于5,并完成下列要求1.创建二叉树的二叉链表存储  2020-11-27 …

建立二叉树的二叉链表表示,实现二叉树的先序、中序、后序和按层次遍历,统计并输出结点个数。1)采用二叉  2020-12-05 …

数据传输速率:是指每秒能传输的二进制信息位数,单位为位/秒可以由下式确定:R=1/T*log2N,式  2020-12-19 …