#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//实现了完全二叉树的基本功能
#define MAX_TREE_SIZE 100//定义树的最大节点数
#define ClearBiTree InitBiTree //清空与初始化做相同操作
#define NodeNum 10//定义节点数
typedef int SqBiTree[MAX_TREE_SIZE];//定义树 值为0时表示空节点
typedef struct {
int level;
int order;//定义节点的位置 如:第2层第2个节点 level=2,order=2
}Position;
//初始化
void InitBiTree(SqBiTree t) {
for (int i = 0; i < MAX_TREE_SIZE; i++)
t[i] = 0;
printf("初始化成功\n");
}
//构造树
void CreateBiTree(SqBiTree t) {
//定义节点数
for (int i = 0; i < NodeNum; i++)
t[i] = i + 1;
printf("构造成功!\n");
}
//判空
int EmptyBiTree(SqBiTree t) {
return t[0] == 0;
}
//求树的深度
int DepthBiTree(SqBiTree t) {
if (EmptyBiTree(t)) return 0;
else {
int i = 0;
for (i = MAX_TREE_SIZE-1; i >= 0; i--) {
if (t[i] != 0) break;
}
i++;//节点数
int depth = 1;
while (powl(2, depth) <= i)
depth++;
return depth;
}
}
//返回根
void ReRootBiTree(SqBiTree t, int& e) {
if (EmptyBiTree(t)) exit(0);
else e = t[0];
}
//根据位置返回值
int Value(SqBiTree t, Position p) {
if (EmptyBiTree(t)) exit(0);
else return t[(int)powl(2, p.level - 1) + p.order - 2];//计算公式"(int)powl(2,p.level-1)-1" + "p.order" -1
}
//根据位置赋值
void Assign(SqBiTree t, Position p, int e) {
int index = (int)powl(2, p.level - 1) + p.order - 2;
if (e != 0 && t[(index + 1) / 2 - 1] == 0) exit(0);//双亲为空
else if (e == 0 && t[2 * index + 1] == 0 || t[2 * index + 2] == 0) exit(0);
else t[index] = e;
}
//返回双亲
int ReParentBiTree(SqBiTree t, int e) {
if (EmptyBiTree(t)) exit(0);
else {
for (int i = 1; i < MAX_TREE_SIZE; i++)
if (t[i] == e)
return t[(i + 1) / 2 - 1];
}
return 0;//没找到
}
//返回左孩子
int ReLeftKidBiTree(SqBiTree t, int e) {
if (EmptyBiTree(t)) exit(0);
else {
for (int i = 0; i < MAX_TREE_SIZE; i++)
if (t[i] == e)
return t[2 * i + 1];//2*(i+1)-1
}
return 0;//没找到
}
//返回右孩子
int ReRightKidBiTree(SqBiTree t, int e) {
if (EmptyBiTree(t)) exit(0);
else {
for (int i = 0; i < MAX_TREE_SIZE; i++)
if (t[i] == e)
return t[2 * i + 2];//2*(i+1)-1
}
return 0;//没找到
}
//返回左兄弟
int ReLeftSibBiTree(SqBiTree t, int e) {
if (EmptyBiTree(t)) exit(0);
else{
for (int i = 1; i < MAX_TREE_SIZE; i++) {
if (t[i] == e && i % 2 == 0)
return t[i - 1];
}
}
return 0;
}
//返回右兄弟
int ReRightSibBiTree(SqBiTree t, int e) {
if (EmptyBiTree(t)) exit(0);
else {
for (int i = 1; i < MAX_TREE_SIZE; i++) {
if (t[i] == e && i % 2 != 0)
return t[i + 1];
}
}
return 0;
}
//以下遍历利用递归
//先序遍历
void PreOrderSolution(SqBiTree t,int e) {
printf("%d ", t[e]);
if (t[2 * e + 1]) PreOrderSolution(t, 2 * e + 1);
if (t[2 * e + 2]) PreOrderSolution(t, 2 * e + 2);
}
//遍历
void PreOrderTraverse(SqBiTree t) {
if (EmptyBiTree(t)) exit(0);
else PreOrderSolution(t, 0);
printf("\n");
}
//中序
void InOrderSolution(SqBiTree t, int e) {
if (t[2 * e + 1]) PreOrderSolution(t, 2 * e + 1);
printf("%d ", t[e]);
if (t[2 * e + 2]) PreOrderSolution(t, 2 * e + 2);
}
//遍历
void InOrderTraverse(SqBiTree t) {
if (EmptyBiTree(t)) exit(0);
else InOrderSolution(t, 0);
printf("\n");
}
//后序
void PostOrderSolution(SqBiTree t, int e) {
if (t[2 * e + 1]) PreOrderSolution(t, 2 * e + 1);
if (t[2 * e + 2]) PreOrderSolution(t, 2 * e + 2);
printf("%d ", t[e]);
}
//遍历
void PostOrderTraverse(SqBiTree t) {
if (EmptyBiTree(t)) exit(0);
else PostOrderSolution(t, 0);
printf("\n");
}
//正常遍历
void Traverse(SqBiTree t) {
int i = MAX_TREE_SIZE-1;
while (t[i] == 0)
i--;
for (int j = 0; j <= i; j++)
if(t[j]) printf("%d ", t[j]);
printf("\n");
}
int main() {
SqBiTree t;
InitBiTree(t);
CreateBiTree(t);
printf("深度是%d\n", DepthBiTree(t));
int e;
ReRootBiTree(t, e);
printf("根的值是%d\n", e);
//遍历
printf("正常遍历树....\n");
Traverse(t);
printf("先序遍历树....\n");
PreOrderTraverse(t);
printf("中序遍历树....\n");
InOrderTraverse(t);
printf("后序遍历树....\n");
PostOrderTraverse(t);
// 取值 赋值
Position p = { 2,2 };
printf("返回的值是%d\n", Value(t, p));
Assign(t, p, 11);//赋值11
printf("正常遍历树....\n");
Traverse(t);
//孩子 兄弟
printf("右孩子是%d\n", ReRightKidBiTree(t, 1));
printf("左孩子是%d\n", ReLeftKidBiTree(t, 1));
printf("右兄弟是%d\n", ReRightSibBiTree(t, 2));
printf("左兄弟是%d\n", ReLeftSibBiTree(t, 11));
ClearBiTree(t);
printf("树已清空!\n");
}
数据结构---顺序二叉树
最新推荐文章于 2023-07-01 20:50:31 发布