C语言完成以下代码:二叉树T中,如果非叶子结点都有两棵非空子树,那么称二叉树T是一棵完全二叉树。现在根据边的连接情况判断一棵树是否是完全二叉树。输入第一行有2个整数n(0 < n < 1024)和r(1<=r<=n), 表示结点数和树根,接下来n-1行每行有2个整数a,b (1 <= a,b <= n)表示a结点和b结点有一条边相连(数据保证是一棵树而不是一座森林)如果是完全二叉树 输出yes 否则输出no
时间: 2024-02-01 12:14:32 浏览: 74
判断二叉树是否为完全二叉树
```c
#include <stdio.h>
#define MAXN 1024
int parent[MAXN];
int left[MAXN];
int right[MAXN];
int is_leaf[MAXN];
int main() {
int n, r;
scanf("%d %d", &n, &r);
for (int i = 1; i <= n; i++) {
is_leaf[i] = 1;
}
for (int i = 1; i < n; i++) {
int a, b;
scanf("%d %d", &a, &b);
parent[b] = a;
is_leaf[a] = 0;
}
int complete = 1;
for (int i = 1; i <= n; i++) {
if (is_leaf[i]) {
continue;
}
if (left[parent[i]]) {
right[parent[i]] = i;
} else {
left[parent[i]] = i;
}
}
int level = 1;
while (left[r]) {
level++;
if (!right[r]) {
complete = 0;
break;
}
r = left[r];
}
printf("%s\n", complete ? "yes" : "no");
return 0;
}
```
思路解析:
1. 输入结点数和根结点编号,初始化叶子结点数组 `is_leaf` 为 1。
2. 读入每条边,记录父结点和子结点,同时将父结点标记为非叶子结点。
3. 遍历所有非叶子结点,根据先左后右的顺序将子结点分别记录到 `left` 和 `right` 数组中。
4. 从根结点开始往左下角遍历,同时记录当前层数,如果某一层没有满足完全二叉树的条件(即某个结点只有左孩子而没有右孩子),则该树不是完全二叉树。
时间复杂度:$O(n)$
阅读全文