c语言用顺序存储写完全二叉树找其中一个结点的双亲结点和左孩子结点和右孩子结点,输入时如果结点为空用#代替,第一行输入二叉树各结点的值,第二行输入要查找的结点,输入的是字符
时间: 2024-05-19 21:14:56 浏览: 62
-1代替。
完全二叉树是一种特殊的二叉树,其所有层的结点都填满(除最后一层外),最后一层的结点从左到右填入。如果某个结点没有左孩子或右孩子,则用-1代替。
实现这个算法需要用到顺序存储。具体来说,将完全二叉树的结点按照从左到右、从上往下的顺序依次存放在一个数组中。如果结点的下标是i,那么它的左孩子的下标是2*i,右孩子的下标是2*i+1,双亲结点的下标是i/2(向下取整)。
给出一个例子:
假设有如下完全二叉树:
1
/ \
2 3
/\ /\
4 5 6 7
用数组存储时为:
{1, 2, 3, 4, 5, 6, 7}
这个数组的下标从0开始,所以1的下标是0,2的下标是1,3的下标是2,4的下标是3,依此类推。
如果要找结点5的双亲结点,左孩子和右孩子,可以按照如下方法计算:
1. 找出结点5的下标,即4。
2. 计算双亲结点的下标:i/2=2。
3. 计算左孩子的下标:2*i=8。
4. 计算右孩子的下标:2*i+1=9。
所以结点5的双亲结点是3,左孩子是空,右孩子是空。
相关问题
c语言用顺序存储写完全二叉树找其中一个结点的双亲结点和左孩子结点和右孩子结点,输入时如果结点为空用#代替,第一行输入二叉树各结点的值,第二行输入要查找的结点
-1表示。
完全二叉树的顺序存储一般使用一维数组来表示,具体存储方式如下:
- 若某结点的下标是i,则它的左孩子下标是2i,右孩子下标是2i+1。
- 若某结点的下标是i,则它的双亲下标是i/2,当i为1时表示该结点为根节点,没有双亲。
因此,要求某个结点的双亲结点和左右孩子结点,只需根据上述公式计算即可。具体实现代码如下:
```c
#include <stdio.h>
#define MAXSIZE 100
int tree[MAXSIZE];
int main()
{
int i, j;
printf("请输入完全二叉树的结点,空结点用-1表示:\n");
i = 1;
// 输入所有结点,存储到数组中
while (scanf("%d", &tree[i]) != EOF) {
i++;
}
int k;
printf("请输入要查询的结点:\n");
scanf("%d", &k);
// 查找结点的下标
j = 1;
while (j < i && tree[j] != k) {
j++;
}
if (j >= i) {
printf("没有找到该结点\n");
return 0;
}
// 查找该结点的双亲结点和左右孩子结点
if (j > 1) {
printf("该结点的双亲结点是:%d\n", tree[j/2]);
}
if (2*j < i && tree[2*j] != -1) {
printf("该结点的左孩子结点是:%d\n", tree[2*j]);
}
if (2*j+1 < i && tree[2*j+1] != -1) {
printf("该结点的右孩子结点是:%d\n", tree[2*j+1]);
}
return 0;
}
```
注意在输入空结点时使用-1表示,查找时也要注意该结点是否存在,如果不存在则输出提示信息。
24.C语言编写顺序二叉树:1)创建顺序结构的二叉树 2)求二叉树的高度 3)求结点i的双亲,孩子结点 4)求二叉树的叶子结点数
在C语言中,我们可以利用结构体和指针来实现顺序二叉树。下面是一些关键步骤的简要介绍:
1) **创建顺序结构的二叉树**:
- 定义一个二叉树节点的数据结构,包含两个指向子节点的指针 `left` 和 `right`,以及一个数据域 `data`。
```c
typedef struct TreeNode {
int data;
struct TreeNode *left, *right;
} Node;
```
创建函数可以接收一个整数值并分配一个新的节点。
2) **求二叉树的高度**:
- 使用递归的方法计算高度,对于非空树,左、右子树高度加一的较大值即为其高度。
```c
int height(Node* root) {
if (root == NULL)
return 0;
else
return 1 + max(height(root->left), height(root->right));
}
```
3) **求结点i的双亲、孩子结点**:
- 对于已知节点 `node`,双亲通常存储在另一个全局变量或通过递归调用从根节点开始查找。
- 孩子结点则通过比较节点索引和当前遍历到的节点索引来获取。
```c
// 假设有一个数组存储了所有节点
Node* parent_of_i(Node* node, int i) {
// ...在数组中查找...
}
Node* left_child(Node* node) {
return node->left;
}
Node* right_child(Node* node) {
return node->right;
}
```
4) **求二叉树的叶子结点数**:
- 叶子节点是没有孩子的节点,可以遍历整个树并在遇到NULL子节点时计数。
```c
int leaf_count(Node* root) {
int count = 0;
if (root != NULL) {
if (root->left == NULL && root->right == NULL) // 判断是否为叶子节点
count++;
count += leaf_count(root->left) + leaf_count(root->right);
}
return count;
}
```
阅读全文