#include <stdio.h>
#include <stdbool.h>
// 定义树节点结构体
typedef struct TreeNode {
float data; // 节点数据
bool isEmpty; // 是否为空节点
} TreeNode;
// 初始化顺序存储的树
void InitSqTree(TreeNode t[], int length) {
// 将所有节点标记为空
for (int i = 0; i < length; i++) {
t[i].isEmpty = true;
}
}
// 检查某个索引处的节点是否为空
bool isEmpty(TreeNode t[], int length, int index) {
// 如果索引越界,返回空
if (index < 0 || index >= length) {
return true;
}
return t[index].isEmpty;
}
// 获取左孩子节点的索引
int getLchild(TreeNode t[], int length, int index) {
int lchild = 2 * index + 1;
// 检查左孩子是否为空
if (isEmpty(t, length, lchild)) {
printf("左孩子空\n");
return -1;
}
return lchild;
}
// 获取右孩子节点的索引
int getRchild(TreeNode t[], int length, int index) {
int rchild = 2 * index + 2;
// 检查右孩子是否为空
if (isEmpty(t, length, rchild)) {
printf("右孩子空\n");
return -1;
}
return rchild;
}
// 获取父节点的索引
int getFather(TreeNode t[], int length, int index) {
// 根节点没有父节点
if (index == 0) {
printf("父节点为根\n");
return -1;
}
return (index - 1) / 2;
}
// 访问节点,打印节点数据和数组下标
void visitNode(TreeNode* t, int index) {
if (index < 0) {
return;
}
printf("数组下标: %d, 结点数值: %f\n", index, t[index].data);
}
// 先序遍历顺序存储的树
void PreOrderSqTree(TreeNode* t, int length, int index) {
// 如果当前节点为空,结束遍历
if (isEmpty(t, length, index)) {
printf("当前结点空\n");
return;
}
// 访问当前节点
visitNode(t, index);
// 递归访问左孩子
int lchild = getLchild(t, length, index);
PreOrderSqTree(t, length, lchild);
// 递归访问右孩子
int rchild = getRchild(t, length, index);
PreOrderSqTree(t, length, rchild);
}
// 中序遍历顺序存储的树
void InOrderSqTree(TreeNode* t, int length, int index) {
// 如果当前节点为空,结束遍历
if (isEmpty(t, length, index)) {
printf("当前结点空\n");
return;
}
// 递归访问左孩子
int lchild = getLchild(t, length, index);
InOrderSqTree(t, length, lchild);
// 访问当前节点
visitNode(t, index);
// 递归访问右孩子
int rchild = getRchild(t, length, index);
InOrderSqTree(t, length, rchild);
}
// 后序遍历顺序存储的树
void PostOrderSqTree(TreeNode* t, int length, int index) {
// 如果当前节点为空,结束遍历
if (isEmpty(t, length, index)) {
printf("当前结点空\n");
return;
}
// 递归访问左孩子
int lchild = getLchild(t, length, index);
// 递归访问右孩子
int rchild = getRchild(t, length, index);
PostOrderSqTree(t, length, lchild);
PostOrderSqTree(t, length, rchild);
// 访问当前节点
visitNode(t, index);
}
int main() {
TreeNode nodes[10];
// 初始化树
InitSqTree(nodes, 10);
// 设置一些节点的数据
nodes[0].data = 1.0;
nodes[0].isEmpty = false;
nodes[1].data = 2.0;
nodes[1].isEmpty = false;
nodes[2].data = 3.0;
nodes[2].isEmpty = false;
nodes[3].data = 4.0;
nodes[3].isEmpty = false;
nodes[4].data = 5.0;
nodes[4].isEmpty = true;
nodes[5].isEmpty = false; // 假设没有数据但非空
nodes[6].data = 7.0;
nodes[6].isEmpty = false;
nodes[7].data = 8.0;
nodes[7].isEmpty = false;
nodes[8].data = 9.0;
nodes[8].isEmpty = false;
nodes[9].data = 10.0;
nodes[9].isEmpty = false;
// 进行先序遍历
printf("先序遍历:\n");
PreOrderSqTree(nodes, 10, 0);
printf("\n\n\n\n\n");
// 进行中序遍历
printf("中序遍历:\n");
InOrderSqTree(nodes, 10, 0);
printf("\n\n\n\n\n");
// 进行后序遍历
printf("后序遍历:\n");
PostOrderSqTree(nodes, 10, 0);
return 0;
}