数据结构:二叉树(先、中、后序)

一、实现功能描述:

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:
  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值