思路: 首先定义两个函数,`getParent`函数用于获取指定结点的双亲结点的索引,`printDescendants`函数用于输出指定结点的所有子孙。然后在`main`函数中,创建表示完全二叉树的数组A,并针对指定结点索引进行相关操作,包括输出双亲结点和所有子孙。
#include <stdio.h>
// 获取指定结点的双亲结点
int getParent(int index) {
if (index <= 0) {
return -1; // 根节点没有双亲
} else {
return (index - 1) / 2;
}
}
// 输出指定结点的所有子孙
void printDescendants(int A[], int n, int index) {
if (index < n) {
printf("结点%d的值为:%d\n", index, A[index]);
// 计算左右子节点的索引
int leftChild = 2 * index + 1;
int rightChild = 2 * index + 2;
// 输出左子节点的值和所有子孙
if (leftChild < n) {
printf("结点%d的左子节点为:%d\n", index, A[leftChild]);
printDescendants(A, n, leftChild);
}
// 输出右子节点的值和所有子孙
if (rightChild < n) {
printf("结点%d的右子节点为:%d\n", index, A[rightChild]);
printDescendants(A, n, rightChild);
}
}
}
int main() {
int A[] = {1, 2, 3, 4, 5, 6, 7}; // 假设完全二叉树的顺序存储在数组A中
int n = sizeof(A) / sizeof(int); // n为数组A的长度
int index = 2; // 需要输出双亲和所有子孙的结点索引,这里以索引为2的结点为例
// 输出指定结点的双亲结点
int parentIndex = getParent(index);
if (parentIndex != -1) {
printf("结点%d的双亲结点为:%d\n", index, A[parentIndex]);
// 输出指定结点的所有子孙
printDescendants(A, n, index);
} else {
printf("结点%d为根节点,无双亲结点\n", index);
}
return 0;
}