二叉树的顺序存储常见操作

一:
二叉树的顺序存储结构
在这里插入图片描述
在这里插入图片描述
二:
创建二叉树的过程
在这里插入图片描述
在这里插入图片描述
三:
代码实现

#ifndef   _seqtree_h
#define   _seqtree_h

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>


#define maxsize 100

typedef char seqtree[maxsize];

extern void InitSeqTree(seqtree tree);
extern void CreateSeqTree(seqtree tree, int i);
extern int GetSeqTreeDepth(seqtree tree);
extern int  GetSeqTreeLength(seqtree tree);
extern char GetSeqTreeRoot(seqtree tree);

#endif // !_seqtree_h
#include"seqtree.h"

/* 初始化空二叉树 */
void InitSeqTree(seqtree tree) 
{
	//将字符数组中的每个元素都设置为空字符
	for (int i = 0; i < maxsize; i++)
	{
		tree[i] = '\0';
	}
	
}

/* 创建完全二叉树,i为数组中的下标 */
void CreateSeqTree(seqtree tree, int i)
{
	char ch;

	ch = getchar();

	fflush(stdin);

	if (ch == '^') //输入^符号表示结束当前结点的输入
	{
		tree[i] = '\0';

		return;
	}
	tree[i] = ch;
	//某个结点输入完毕后,还需要让用户输入左孩子和右孩子
	printf("左孩子结点:");

	CreateSeqTree(tree, 2 * i + 1); //递归调用

	printf("右孩子结点:");

	CreateSeqTree(tree, 2 * (i + 1));
}

/* 获取树的根结点元素 */
char GetSeqTreeRoot(seqtree tree)
{
	return tree[0];
}

/* 获取树的结点数 */
int  GetSeqTreeLength(seqtree tree)
{
	int len = 0;

	for (int i = 0; i < maxsize; i++)
	{
		if (tree[i] == '\0')
			continue;
		len++;
		/*
		  if(tree[i]!='\0')		    
			  len++;	
		*/
	}
	return len;
}

/* 获取树的深度 */
int GetSeqTreeDepth(seqtree tree)
{
	//性质2:深度为k的二叉树最多有2^k-1个结点
	int depth = 0;      //深度

	int len = GetSeqTreeLength(tree);

	while ((int)pow(2, depth) - 1 < len) 
	{
		depth++;
	}
	return depth;
}
#include"seqtree.h"
int main()
{
	int len = 0;

	seqtree tree;

	InitSeqTree(tree);

	printf("请输入根节点内容:");

	CreateSeqTree(tree, 0);

	for(int i=0;i<15;i++)
	{
		printf("%d\t", tree[i]);
	}

	printf("\n");

	system("pause");

	return 0;
}

注:代码测试还有点问题。

以下是修改后的代码,测试无误。

#include"seqtree.h"
void k(int i);
int main()
{
	int depth, root;

	int count;

	seqtree tree;

	InitSeqTree(tree);

	printf("请输入根节点内容:");

	CreateSeqTree(tree, 0);

	for(int i=0;i<15;i++)//这里只打印前15个元素
	{
		printf("%d\t", tree[i]);
	}

	printf("\n");

	root=GetSeqTreeRoot(tree);

	printf("根结点元素为:%d\n", root);

	count = GetSeqTreeLength(tree);

	printf("树的结点个数为:%d\n", count);

	depth = GetSeqTreeDepth(tree);

	printf("树的深度为:%d\n", depth);

	system("pause");

	return 0;
}

#include"seqtree.h"

/* 初始化空二叉树 */
void InitSeqTree(seqtree tree) 
{
	//将字符数组中的每个元素都设置为空字符
	for (int i = 0; i < maxsize; i++)
	{
		tree[i] = 0;
	}
	
}

/* 创建完全二叉树,i为数组中的下标 */
void CreateSeqTree(seqtree tree, int i)
{
	int k;

	scanf_s("%d", &k, 2);

	//fflush(stdin);

	if (k== 0) //输入0符号表示结束当前结点的输入
	{
		tree[i] = 0;

		return;
	}

	tree[i] = k;

	//某个结点输入完毕后,还需要让用户输入左孩子和右孩子
	printf("左孩子结点:");

	CreateSeqTree(tree, 2 * i + 1); //递归调用

	printf("右孩子结点:");

	CreateSeqTree(tree, 2 * (i + 1));
}

/* 获取树的根结点元素 */
int GetSeqTreeRoot(seqtree tree)
{
	return tree[0];
}

/* 获取树的结点数 */
int  GetSeqTreeLength(seqtree tree)
{
	int len = 0;

	for (int i = 0; i < maxsize; i++)
	{
		if (tree[i] == '\0')
			continue;
		len++;
		/*
		  if(tree[i]!='\0')		    
			  len++;	
		*/
	}
	return len;
}

/* 获取树的深度 */
int GetSeqTreeDepth(seqtree tree)
{
	//性质2:深度为k的二叉树最多有2^k-1个结点
	int depth = 0;      //深度

	int len = GetSeqTreeLength(tree);

	while ((int)pow(2, depth) - 1 < len) 
	{
		depth++;
	}
	return depth;
}
#ifndef   _seqtree_h
#define   _seqtree_h

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>


#define maxsize 100

typedef int seqtree[maxsize];

extern void InitSeqTree(seqtree tree);
extern void CreateSeqTree(seqtree tree, int i);
extern int GetSeqTreeDepth(seqtree tree);
extern int  GetSeqTreeLength(seqtree tree);
extern int GetSeqTreeRoot(seqtree tree);


#endif // !_seqtree_h

//测试结果
在这里插入图片描述

发布了150 篇原创文章 · 获赞 81 · 访问量 6462

猜你喜欢

转载自blog.csdn.net/qq_38158479/article/details/104122541