一:
二叉树的顺序存储结构
二:
创建二叉树的过程
三:
代码实现
#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
//测试结果