棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。 完全二叉树的特点:叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。 现在根据边的连接情况判断一棵树是否是完全二叉树。 输入 第一行有2个整数n(0 < n < 1024)和r(1<=r<=n), 表示结点数和树根,接下来n-1行每行有2个整数a,b (1 <= a,b <= n)表示a结点和b结点有一条边相连,如果a是b的根结点,则b是a的左子结点,如果b是a的根结点,则a是b的右子结点(数据保证是一棵树而不是一座森林) 使用c++判断如果是完全二叉树 输出yes 否则输出no
时间: 2024-03-24 07:37:15 浏览: 210
求一棵二叉树的深度和双分支结点的个数。
以下是用C++实现判断一棵树是否为完全二叉树的代码示例:
```cpp
#include <iostream>
#include <queue>
using namespace std;
const int MAXN = 1024;
int n, r, depth[MAXN], parent[MAXN][10];
bool is_left[MAXN], is_leaf[MAXN];
void dfs(int u, int p, int d, bool left) {
depth[u] = d;
parent[u][0] = p;
is_left[u] = left;
is_leaf[u] = true;
for (int i = 1; i < 10; i++) {
parent[u][i] = parent[parent[u][i - 1]][i - 1];
}
for (int v = 1; v <= n; v++) {
if (v != p && !is_leaf[v] && parent[v][0] == u) {
dfs(v, u, d + 1, true);
}
}
for (int v = 1; v <= n; v++) {
if (v != p && !is_leaf[v] && parent[v][0] != u) {
dfs(v, u, d + 1, false);
}
}
}
bool is_complete_tree() {
for (int u = 1; u <= n; u++) {
if (is_leaf[u]) {
int v = u;
int d = depth[u];
for (int i = 0; i < d; i++) {
v = parent[v][0];
if (is_left[v] && v != r) {
return false;
}
}
is_leaf[v] = false;
}
}
return true;
}
int main() {
cin >> n >> r;
for (int i = 1; i < n; i++) {
int a, b;
cin >> a >> b;
parent[b][0] = a;
}
dfs(r, 0, 1, true);
cout << (is_complete_tree() ? "yes" : "no") << endl;
return 0;
}
```
首先,我们需要使用dfs算法对树进行遍历,记录每个节点的深度、父节点、是否为左子节点和是否为叶子节点。其中,为了方便后续的判断,我们将左子节点标记为true,右子节点标记为false。
接下来,我们对叶子节点进行遍历,判断它们是否位于完全二叉树的最后一层,并将它们的父节点标记为非叶子节点。如果发现某个叶子节点不符合要求,则该树不是完全二叉树。
最后,如果所有叶子节点都符合要求,则该树为完全二叉树。
阅读全文