一、实现功能描述:
1、使用先序序列来创建二叉树,并使用递归算法实现先序、中序、后序输出。
2、使用先序序列来创建二叉树,并使用非递归算法实现先序、中序、后序输出。
3、使用中序、后序的序列来创建二叉树,并使用先序输出。
4、层序遍历的递归与非递归算法
5、实现另外一种后序非递归遍历的算法
二、方案比较与选择
1、从数据结构的逻辑结构与存储结构角度提供多种解决方案;
存储结构:
①二叉树的顺序存储,寻找后代节点和祖先节点都非常方便,但对于普通的二叉树,顺序存储浪费大量的存储空间,同样也不利于节点的插入和删除。因此顺序存储一般用于存储完全二叉树。
②链式存储相对顺序存储节省存储空间,插入删除节点时只需修改指针,但寻找指定节点时很不方便。不过普通的二叉树一般是用链式存储结构。
逻辑结构:
二叉树不等同于树,是另一种树结构。
二叉树的优势:
有序数组的优势在于二分查找,链表的优势在于数据项的插入和数据项的删除。但是在有序数组中插入数据就会很慢,同样在链表中查找数据项效率就很低。综合以上情况,二叉树可以利用链表和有序数组的优势,同时可以合并有序数组和链表的优势。
二叉树还可分为满二叉树、一般二叉树、完全二叉树。
2、从时空效率角度分析决定最终采用方案的原因。
链式存储相对顺序存储可节省存储空间,插入删除节点时只需修改指针,而且无论使用顺序、链式进行存储,遍历对n个结点的二叉树时间复杂度均为O(n)。且链表的优势在于数据项的插入和数据项的删除。
三、设计算法描述
1、用简单示例结合所设计算法采用的数据逻辑结构图、存储结构图说明算法思想。
二叉树的逻辑结构:
二叉树的存储结构:
先序遍历:(数字表示遍历输出顺序)
中序遍历:(数字表示遍历输出顺序)
后序遍历:(数字表示遍历输出顺序)
2、进行模块划分,给出功能组成框图。形式如下:
非递归算法:
递归算法:
四、算法实现(即完整源程序,带注解)
先序创建树的递归遍历:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
#define FALSE 0
typedef char ElemType;
typedef struct BiTreeNode
{
ElemType data; //存放数据
struct BiTreeNode *lchild; //左孩子
struct BiTreeNode *rchild; //右孩子
}BiTreeNode, *BiTree;
void menu() //打印菜单,供用户选择要执行的功能。
{
printf("\n");
printf("**************************\n");
printf("*******1.按先序遍历*******\n");
printf("*******2.按中序遍历*******\n");
printf("*******3.按后序遍历*******\n");
printf("*******0. 推出程序 *******\n");
printf("**************************\n");
printf("\n");
}
void CreateBiTree(BiTree *T) //使用先序的方式创建二叉树
{
char tree; //定义的tree变量用来接收创建二叉树时输入的字符
scanf_s("%c", &tree);
if (tree == '#')
*T = NULL;
else
{
*T = (BiTree)malloc(sizeof(BiTreeNode)); //使用链式进行存储
(*T)->data = tree;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}
void PreOrderTravel(BiTree T) //先序遍历二叉树
{
if (T == NULL)
return;
printf("%c ", T->data);
PreOrderTravel(T->lchild);
PreOrderTravel(T->rchild);
}
void InOrderTravel(BiTree T) //中序遍历二叉树
{
if (T == NULL)
return;
InOrderTravel(T->lchild);
printf("%c ", T->data);
InOrderTravel(T->rchild);
}
void TailOrderTravel(BiTree T) //后序遍历二叉树
{
if (T == NULL)
return;
TailOrderTravel(T->lchild);
TailOrderTravel(T->rchild);
printf("%c ", T->data);
}
int main()
{
int input;
BiTree T;
printf("创建二叉树\n");
printf("请给二叉树按照先序方式依次输入结点的值(空结点为#):\n");
CreateBiTree(&T);
do
{
menu();
printf("please enter your choice:");
scanf_s("%d", &input);
switch (input)
{
case 1: printf("先序方式遍历结果:");
PreOrderTravel(T);
printf("\n");
break;
case 2: