输入n表示结点数,接下来输入n-1行,有三个整数xuv, X=0表示u是v的左儿子, X=1表示u是v的右儿子,根结点的编号是1,数据保证构成一棵二叉树,现在输出它是否为完全二叉树,如果是则输出yes,否则输出no,用c++写
时间: 2024-09-08 12:01:25 浏览: 34
在C++中,你可以通过递归的方式来判断一个给定的二叉树是否是完全二叉树。首先,你需要定义一个结构体来表示二叉树节点,并创建一个辅助函数来处理输入的数据。然后,主函数会检查每个节点是否满足完全二叉树的性质。
```cpp
#include <iostream>
using namespace std;
// 定义二叉树节点结构
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 辅助函数,用于构建二叉树并检查是否完全二叉
bool isCompleteBinaryTree(TreeNode* root, int level = 0) {
if (root == NULL) return true; // 空节点视为完全二叉
// 检查当前层所有节点都已填充,且下一层只有一个空节点
if (level % 2 == 1 && !root->right) return isCompleteBinaryTree(root->left, level + 1);
if (level % 2 == 0 && !root->left) return isCompleteBinaryTree(root->right, level + 1);
return isCompleteBinaryTree(root->left, level + 1) && isCompleteBinaryTree(root->right, level + 1);
}
int main() {
int n;
cin >> n;
// 根据输入建立二叉树
TreeNode* root = new TreeNode(1); // 根节点
for (int i = 2; i <= n; ++i) {
int parent, leftSon, rightSon;
cin >> parent >> leftSon >> rightSon;
if (parent == 0) { // 如果父节点是0,说明新节点是根节点
if (leftSon) root->left = new TreeNode(leftSon);
if (rightSon) root->right = new TreeNode(rightSon);
} else {
TreeNode* node = parent - 1;
if (leftSon) node->left = (leftSon ? new TreeNode(leftSon) : nullptr);
if (rightSon) node->right = (rightSon ? new TreeNode(rightSon) : nullptr);
}
}
// 判断并输出结果
bool isFullBinary = isCompleteBinaryTree(root);
cout << (isFullBinary ? "yes" : "no") << endl;
// 清理内存
delete root;
return 0;
}
阅读全文