赞
踩
2022.11.19
本关任务:以顺序结构存储二叉树,编写前序、中序、后序及层次顺序遍历二叉树的算法,并计算二叉树深度、所有结点总数。
回去看题吧太长了。二叉树的顺序存储及基本操作
平台会对你编写的代码进行测试:
测试输入:ABCDEF###G##H
预期输出:
按先序遍历的结果为:ABDEGCFH
按中序遍历的结果为:DBGEAFHC
按后序遍历的结果为:DGEBHFCA
按层序遍历的遍历结果为:ABCDEFGH
该二叉树的高度为:4
开始你的任务吧,祝你成功!
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> using namespace std; #define OK 1 #define ERROR 0 #define MAX_TREE_SIZE 100 typedef char TElemType ; typedef TElemType SqBiTree[MAX_TREE_SIZE]; TElemType Nil='#'; void input(TElemType &x) // 函数变量 { scanf("%c",&x); } void visit(TElemType x) // 函数变量 { printf("%c",x); } void InitBiTree(SqBiTree &T) { // 构造空二叉树T。因为T是数组名,故不需要& int i; for(i=0;i<MAX_TREE_SIZE;i++) T[i]=Nil; // 初值为空(Nil在主程中定义) } void CreateBiTree(SqBiTree &T) { // 按层序次序输入二叉树中结点的值(字符型或整型), 构造顺序存储的二叉树T /********** Begin **********/ int i=1; scanf("%s",T+1); while(T[i] != '\0') i++; T[i]='#'; /********** End **********/ } int BiTreeEmpty(SqBiTree T) { // 初始条件:二叉树T存在。操作结果:若T为空二叉树,则返回TRUE,否则FALSE if(T[1]==Nil) // 根结点为空,则树空 return 1; else return 0; } int BiTreeDepth(SqBiTree T) { // 初始条件:二叉树T存在。操作结果:返回T的深度 /********** Begin **********/ int i=MAX_TREE_SIZE-1,j; while(T[i]=='#') i--; j=i; int dep=0; do{ dep++; j=j/2; }while(j>=1); return dep; /********** End **********/ } void PreTraverse(SqBiTree T,int e) { // PreOrderTraverse()调用 /********** Begin **********/ if(T[e] != '#'){ visit(T[e]); PreTraverse(T,2*e); PreTraverse(T,2*e+1); } /********** End **********/ } void PreOrderTraverse(SqBiTree T,void(*Visit)(TElemType)) { // 初始条件:二叉树存在,Visit是对结点操作的应用函数 // 操作结果:先序遍历T,对每个结点调用函数Visit一次且仅一次 if(!BiTreeEmpty(T)) // 树不空 PreTraverse(T,1); printf("\n"); } void InTraverse(SqBiTree T,int e) { // InOrderTraverse()调用 /********** Begin **********/ if(T[e] != '#'){ InTraverse(T,2*e); visit(T[e]); InTraverse(T,2*e+1); } /********** End **********/ } void InOrderTraverse(SqBiTree T,void(*Visit)(TElemType)) { // 初始条件:二叉树存在,Visit是对结点操作的应用函数 // 操作结果:中序遍历T,对每个结点调用函数Visit一次且仅一次 if(!BiTreeEmpty(T)) // 树不空 InTraverse(T,1); printf("\n"); } void PostTraverse(SqBiTree T,int e) { // PostOrderTraverse()调用 /********** Begin **********/ if(T[e] != '#'){ PostTraverse(T,2*e); PostTraverse(T,2*e+1); visit(T[e]); } /********** End **********/ } void PostOrderTraverse(SqBiTree T,void(*Visit)(TElemType)) { // 初始条件:二叉树T存在,Visit是对结点操作的应用函数 // 操作结果:后序遍历T,对每个结点调用函数Visit一次且仅一次 if(!BiTreeEmpty(T)) // 树不空 PostTraverse(T,1); printf("\n"); } void LevelOrderTraverse(SqBiTree T,void(*Visit)(TElemType)) { // 层序遍历二叉树 /********** Begin **********/ int dep=BiTreeDepth(T); int tree_max=pow(dep,2)-1; for(int i=1;i<tree_max;i++){ if(T[i]=='#') continue; visit(T[i]); } /********** End **********/ } int main() { TElemType e; SqBiTree Bt; InitBiTree(Bt); CreateBiTree(Bt); printf("按先序遍历的结果为:"); PreOrderTraverse(Bt,visit); printf("按中序遍历的结果为:"); InOrderTraverse(Bt,visit); printf("按后序遍历的结果为:"); PostOrderTraverse(Bt,visit); printf("按层序遍历的遍历结果为:"); LevelOrderTraverse(Bt,visit); printf("\n该二叉树的高度为:%d",BiTreeDepth(Bt) ); return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。