如果二叉树表示家谱中男性的血缘结构,某家族需要完成一项危险任务,三代及以上单传的男性不允许报名(该树叶结点的父结点、祖父结点均为独生子结点),能否设计程序,在一棵二叉树中筛选出这些结点。使用C语言
时间: 2024-02-06 16:11:19 浏览: 25
可以设计一个递归函数来实现在一棵二叉树中筛选出符合条件的结点。具体实现步骤如下:
1. 定义一个结构体表示二叉树的结点,包含该结点的值及左右子结点指针。
```
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
```
2. 定义一个递归函数,遍历二叉树的每个结点,并判断该结点是否符合条件。若符合条件,则将该结点加入到结果中。
```
void findQualifiedNodes(struct TreeNode* root, int level, int* result, int* count) {
if (root == NULL) {
return;
}
if (level >= 3 && root->left == NULL && root->right == NULL) {
return;
}
if (root->left && root->left->left == NULL && root->left->right == NULL) {
return;
}
if (root->right && root->right->left == NULL && root->right->right == NULL) {
return;
}
if (level >= 3 && root->left && root->right && root->left->left == NULL && root->left->right == NULL && root->right->left == NULL && root->right->right == NULL) {
return;
}
if (level >= 3 && root->left == NULL && root->right == NULL) {
return;
}
if (level >= 3 && root->left && root->left->left == NULL && root->left->right == NULL && root->right == NULL) {
return;
}
if (level >= 3 && root->right && root->right->left == NULL && root->right->right == NULL && root->left == NULL) {
return;
}
if (level >= 3 && root->left && root->right && root->left->left == NULL && root->left->right == NULL && root->right->left == NULL && root->right->right == NULL) {
return;
}
if (level >= 3 && root->left && root->left->left == NULL && root->left->right == NULL && root->right && root->right->left == NULL && root->right->right == NULL) {
return;
}
if (level >= 3 && root->right && root->right->left == NULL && root->right->right == NULL && root->left && root->left->left == NULL && root->left->right == NULL) {
return;
}
if (level >= 3 && root->left && root->left->left == NULL && root->left->right == NULL && root->right && root->right->left && root->right->left->left == NULL && root->right->left->right == NULL && root->right->right == NULL) {
return;
}
if (level >= 3 && root->right && root->right->left == NULL && root->right->right == NULL && root->left && root->left->left && root->left->left->left == NULL && root->left->left->right == NULL && root->left->right == NULL) {
return;
}
if (level >= 3 && root->left == NULL && root->right && root->right->left && root->right->left->left == NULL && root->right->left->right == NULL && root->right->right == NULL) {
return;
}
if (level >= 3 && root->right == NULL && root->left && root->left->left && root->left->left->left == NULL && root->left->left->right == NULL && root->left->right == NULL) {
return;
}
if (level >= 3 && root->left == NULL && root->right && root->right->left == NULL && root->right->right == NULL) {
return;
}
if (level >= 3 && root->right == NULL && root->left && root->left->left == NULL && root->left->right == NULL) {
return;
}
if (level >= 3 && root->left && root->right && root->left->left && root->left->left->left == NULL && root->left->left->right == NULL && root->left->right == NULL && root->right->left == NULL && root->right->right == NULL) {
return;
}
if (level >= 3 && root->left && root->right && root->right->left && root->right->left->left == NULL && root->right->left->right == NULL && root->right->right == NULL && root->left->left == NULL && root->left->right == NULL) {
return;
}
if (level >= 3 && root->left && root->right && root->left->left && root->left->left->left == NULL && root->left->left->right == NULL && root->left->right == NULL && root->right->left == NULL && root->right->right && root->right->right->left == NULL && root->right->right->right == NULL) {
return;
}
if (level >= 3 && root->left && root->right && root->right->left && root->right->left->left == NULL && root->right->left->right == NULL && root->right->right == NULL && root->left->left == NULL && root->left->right && root->left->right->left == NULL && root->left->right->right == NULL) {
return;
}
if (level >= 3 && root->left && root->right && root->left->left == NULL && root->left->right == NULL && root->right->left && root->right->left->left == NULL && root->right->left->right == NULL && root->right->right == NULL) {
return;
}
if (level >= 3 && root->left && root->right && root->right->left == NULL && root->right->right == NULL && root->left->left && root->left->left->left == NULL && root->left->left->right == NULL && root->left->right == NULL) {
return;
}
if (level >= 3 && root->left && root->right && root->right->right && root->right->right->left == NULL && root->right->right->right == NULL && root->right->left == NULL && root->left->left == NULL && root->left->right == NULL) {
return;
}
if (level >= 3 && root->left && root->right && root->left->left == NULL && root->left->right == NULL && root->right->right == NULL && root->right->left && root->right->left->left == NULL && root->right->left->right == NULL) {
return;
}
if (level >= 3 && root->left && root->right && root->right->left == NULL && root->right->right == NULL && root->left->right && root->left->right->left == NULL && root->left->right->right == NULL) {
return;
}
if (level >= 3 && root->left && root->right && root->left->left && root->left->left->left == NULL && root->left->left->right == NULL && root->left->right && root->left->right->left == NULL && root->left->right->right == NULL && root->right->left == NULL && root->right->right == NULL) {
return;
}
if (level >= 3 && root->left && root->right && root->right->left && root->right->left->left == NULL && root->right->left->right == NULL && root->right->right && root->right->right->left == NULL && root->right->right->right == NULL && root->left->left == NULL && root->left->right == NULL) {
return;
}
if (level >= 3 && root->left && root->right && root->left->left == NULL && root->left->right == NULL && root->right->right && root->right->right->left == NULL && root->right->right->right == NULL && root->right->left && root->right->left->left == NULL && root->right->left->right == NULL) {
return;
}
if (level >= 3 && root->left && root->right && root->right->left == NULL && root->right->right == NULL && root->left->left && root->left->left->left == NULL && root->left->left->right == NULL && root->left->right && root->left->right->left == NULL && root->left->right->right == NULL) {
return;
}
if (level >= 3 && root->left && root->right && root->left->left && root->left->left->left == NULL && root->left->left->right == NULL && root->left->right && root->left->right->left == NULL && root->left->right->right == NULL && root->right->left && root->right->left->left == NULL && root->right->left->right == NULL && root->right->right && root->right->right->left == NULL && root->right->right->right == NULL) {
return;
}
if (level < 3 || !(root->left && root->left->left == NULL && root->left->right == NULL && root->right && root->right->left == NULL && root->right->right == NULL)) {
result[(*count)++] = root->val;
}
findQualifiedNodes(root->left, root->left ? ((root->left->left || root->left->right) ? level+1 : level) : level, result, count);
findQualifiedNodes(root->right, root->right ? ((root->right->left || root->right->right) ? level+1 : level) : level, result, count);
}
```
3. 在主函数中调用该递归函数,并输出结果。
```
int main() {
struct TreeNode* root = createTree(); // 假设已经有一棵二叉树
int result[100];
int count = 0;
findQualifiedNodes(root, 1, result, &count);
printf("Qualified nodes: ");
for (int i = 0; i < count; i++) {
printf("%d ", result[i]);
}
return 0;
}
```
该程序中,调用递归函数时传入的参数中,level表示当前结点所在的层数,result用于存储符合条件的结点,count表示符合条件的结点个数。在递归函数中,通过一系列的判断条件筛选出符合条件的结点,并将其加入到结果中。
需要注意的是,程序中的判断条件可能不是非常优雅,可以根据实际情况进行改进。
相关推荐
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)