一、题目
本程序将实现两个内容:汉诺塔的实现和打印二叉树。
汉诺塔的实现:编程序显示n层汉诺塔的调整过程。
打印二叉树:从键盘输入先序序列(EBADCFHGIKJ)和中序序列(ABCDEFGHIJK),将遍历结果树形打印输出。
二、需求分析
本演示程序用devc++编写,完成n层汉诺塔的调整过程和由先序序列和中序序列确定一颗二叉树由树形打印输出。
①输入的形式和输入值的范围:输入元素时需要输入调整汉诺塔层数的方法及汉诺塔的层数;键盘需要输入给定的先序序列和中序序列;在所有输入中,元素的值都是整数,字母均是大写字母。
②输出的形式:在第一个子程序(汉诺塔)中,所有输出均显示为汉诺塔调整的过程。在第二个子程序(二叉树)中,输出形式则为一棵树形二叉树。
③程序所能达到的功能:完成栈的建立,入栈,出栈等过程。
④测试数据:
- 输入1或2后,再任意输一个数字会展示汉诺塔的移动过程。
- 输入3后,再输入先序序列和后序序列会以树形显示二叉树。
- 输入0后,会提示退出程序。
三、概要设计
为了实现上述程序功能,需要定义栈和树的抽象结构类型:
typedef node ElemType;//栈存的元素类型
//栈结构的定义
typedef struct Stack
{
ElemType* base;
ElemType* top;
int stacksize;
}SeqStack;
基本操作:
int InitStack(SeqStack* S);
操作结果:构造一个栈s
int Push(SeqStack* S, ElemType e);
//初始条件:栈S已经存在
操作结果:栈——插入元素e为新的栈顶元素
int Pop(SeqStack* S, ElemType* e);
//初始条件:栈S已经存在
操作结果:弹栈——删除栈顶元素
int IsEmpty(SeqStack* S);
//初始条件:栈S已经存在
操作结果:判断栈是否为空
空栈返回1,非空栈返回0
const int STACK_INIT_SIZE = 100;
//初始分配的长度
const int STACKINCREMENT = 10;
//分配内存的增量
//树的结构体定义
struct TreeNode {
struct TreeNode* left_child;
struct TreeNode* right_child;
char key;
int depth;
};
基本操作:
gets(tmp_str);
操作结果:读入前序序列
gets(tmp_str);
操作结果:读入中序序列
Node root = ConstructBinTree(pre_order_tree, in_order_tree, 0, tree_size - 1,0, tree_size - 1, 1);
操作结果:构建二叉树
PrintTreeWithRotation(root);
操作结果:打印二叉树(逆中序遍历)
Menu()
操作结果:在屏幕上显示菜单
- 本程序包含个函数:
①主函数main()
②显示操作菜单函数menu()
③打印二叉树函数PrintTreeWithRotation()
④递归汉诺塔移动函数move()
⑤递归汉诺塔移动过程函数hanoi()
⑥初始化栈函数InitSta