二叉树的顺序存储结构

/*
 * 2015年4月19日 16:44:48
 * 目的:用顺序存储结构来表示二叉树
 * 二叉树比较难,所以更应该同过程序来好好理解二叉树的概念。
 * 顺序存储是顺序储存在数组中的,以完全二叉树的形式,不存在的结点
 * 在数组中用0表示。当二叉树是完全二叉树时,效率高而且简单
 * 但是当不是完全二叉树时,会出现内存浪费的情况,这个程序仅仅
 * 用来说明顺序结构怎么存储二叉树的,而且一般二叉树不会用顺序结构,缺点明显
 */

# include <stdio.h>
# define MAXSIZE 50   //设置二叉树最大结点数

int treeData[MAXSIZE]; //定义一个存储结点的数组
int length; //数组中除了首元素外,因为首元素表示了结点的个数,真正元素的个数,包括0;0表示二叉树不存在的结点.

void init()
{
	treeData[0] = 0; //用数组的第一个元素来表示中结点的个数
	length = 0;
}

//判断树是否为空
bool isEmpty()
{
	if(treeData[0] == 0)
		return true;
	else
		return false;
}

//自己创建一个二叉树
void createTree()
{
	printf("请根据二叉树的特点输入数据,二叉树中不存在的结点请用0表示!\n想要结束请输入-1\n");
	int number = 0; //当用户输入-1表示结束

	while(number != -1)
	{
		scanf("%d",&number);
		if(number!=-1)
		{
			length++;
			treeData[length] = number; 

			if(number != 0)
			treeData[0]++; //结点个数+1
		}

		if(length+1 >= MAXSIZE)
		{
			printf("数组越界了!\n");
			break; //跳出循环
		}
	}
}

//打印出二叉树
void showTree()
{
	if(isEmpty())
	{
		printf("树中没有元素,无法显示!");
	}
	else
	{
		for(int i = 1;i <= length;i++)
		{
			printf("%d ",treeData[i]);
			if(i % 10 == 0)
				printf("\n");
		}
		printf("\n");
	}
}

void getpointLength()
{
	printf("二叉树中结点的个数为%d\n",treeData[0]);
}

/* 这个程序本身写的很简单
 * 但是这个程序却让我知道了怎么用顺序结构来存储二叉树
 * 还有用顺序结构存储一般二叉树,为什么不赞成使用这种方法
 * 原因大家应该很清楚,会浪费太多内存空间了.
*/

int main(void)
{
	init();
	createTree();
	showTree();
	getpointLength();
	return 0;
}

时间: 2024-10-10 16:49:28

二叉树的顺序存储结构的相关文章

数据结构(二十二)二叉树的顺序存储结构

一.顺序存储结构对数这种一对多的关系结构实现起来是比较困难的.但是二叉树是一种特殊的树,由于它的特殊性,使得用顺序存储结构也可以实现. 二.二叉树的顺序存储结构就是用一维数组存储二叉树中的结点,并且结点的存储位置,也就是数组的下标要能体现结点之间的逻辑关系,比如双亲与孩子的关系,左右兄弟的关系等. 三.完全二叉树可以将相应下标的结点存到数组的相应下标的位置上,对于一般的二叉树来说,完全可以将其按完全二叉树编号,只不过,把不存在的结点设置为"null"而已.这显然是对存储空间的浪费,所以

(数据结构第六章)二叉树的顺序存储结构

二叉树的五条性质: 1.在二叉树的第i层上至多有2^(i-1)个节点(i>=1) 2.深度为k的二叉树至多有2^k-1个节点(k>=1) 3.对任何一个二叉树T,如果其终端节点数为n0,度为2的节点数为n2,则n0=n2+1. 证:总结点数n=n0+n1+n2 设分支总数B,n=B+1 B=n1+n2:两式加减即证出. 补充个定义:节点拥有的子树数称为节点的度. 树的度是树内各节点度的最大值. 4.具有n个节点的完全二叉树的深度为floor(log(2)n)+1 5.如果对一颗有n个节点的完全

6-1-二叉树顺序存储结构-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第6章  树和二叉树 - 二叉树顺序存储结构 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c        相关测试数据下载  链

二叉树的存储结构

二叉树的存储结构有两种:顺序存储结构和链式存储结构. 顺序存储结构 对于满二叉树和完全二叉树来说,可以将其数据元素逐层存放到一组连续的存储单元中,如图6-3 所示.用一维数组来实现顺序存储结构时,将二叉树中编号为i 的结点存放到数组中的第i 个分量中.如此根据性质6.7,可以得到结点i 的父结点.左右孩子结点分别存放在.2i 以及2i+1 ?i / 2? 分量中. 图6-3 顺序存储结构 这种存储方式对于满二叉树和完全二叉树是非常合适也是高效方便的.因为满二叉树和完全二叉树采用顺序存储结构既不浪

数据结构|-完全二叉树的顺序存储结构的实现

对于一个完全二叉树,假设它有n个结点,对结点进行从1开始编号,对任一结点i满足下面 它的双亲是结点 i/2 (除了i=1的情况) 左孩子是 2i 右孩子是 2i+1 如果2i>n 说明无左孩子 2i+1>n 说明无右孩子 一般的树来说是一对多的关系,使用顺序结构存储起来比较困难,但是二叉树是一种特殊的树,每个结点最多有两个子节点,并且子节点有左右之分,并且兄弟,父亲,孩子可以很方便的通过编号得到,所以我们使用顺序存储结构使用二叉树的存储. using System; using System.

数据结构实验:二叉树遍历(顺序存储结构)

#include<stdio.h> int tree[513],n;//定义全局变量,在遍历的时候可以使用 void PreOrder(int i)//递归 { if(i>n||tree[i]==0) return; printf(" %d",tree[i]); PreOrder(2*i); PreOrder(2*i+1); } void InOrder(int i) { if(i>n||tree[i]==0) return; InOrder(2*i); pri

数据结构 - 二叉树的存储结构

顺序存储结构 二叉树存储结构的类型定义: #define MAX_SIZE 100 typedef telemtype sqbitree[MAX_SIZE]; 用一组地址连续的存储单元依次"自上而下.自左至右"存储完全二叉树的数据元素. 对于完全二叉树上编号为i的结点元素存储在一维数组的下标值为i-1的分量中,如图6-6(c)所示. 对于一般的二叉树,将其每个结点与完全二叉树上的结点相对照,存储在一维数组中, 链式存储结构 设计不同的结点结构可构成不同的链式存储结构. (1) 结点的类

数据结构--树(上)-- 二叉树及存储结构

二叉树及存储结构 二叉树的定义:一个有穷的结点集合.若不为空,则它是由根节点和称为其左子树和右子树的两个不想交的二叉树组成 一般的左右的树是没有左右之分的.二叉树有左右之分. 三种特殊的二叉树 斜二叉树         实质就可以是链表了. 完美二叉树 完全二叉树 二叉树的几个重要的性质 二叉树的抽象数据类型 对二叉树来讲,最重要的就是Traversal() 遍历,讲二叉树基本就讲遍历了. 二叉树的存储结构 顺序存储结构 顺序存储结构 可以存储完全二叉树:从上往下,从左往右,来进行便利.把这种树

二叉树及存储结构

本文的结构: 二叉树的基本形态 二叉树的重要性质 二叉树的抽象数据类型定义 二叉树的存储结构 二叉树T:一个有穷的节点集合.这个集合可以为空,若不为空,则它是由根节点和称为其左子树TL和右子树TR的两个不相交的二叉树组成 二叉树的五种基本形态: (a) 空树 (b) 有一个结点 (c) 右子树为空 (d) 左子树为空 (e) 有左右子树 二叉树的重要性质: 一个二叉树第i层的最大节点数为:2i-1,i >=1; 深度为k的二叉树有最大结点总数为 2k-1,k>=1: 对任何非空二叉树T,若n0