完全二叉树是一种特殊的二叉树,其中除了最后一层外,每一层都被完全填满,并且最后一层的节点尽可能地集中在左侧。完全二叉树可以使用指针和数组两种方式来实现。 使用指针实现完全二叉树使用指针实现完全二叉树时,每个节点包含数据和两个指向子节点的指针。 #include <iostream>
struct TreeNode {
int value;
TreeNode *left, *right;
// 构造函数
TreeNode(int val) : value(val), left(nullptr), right(nullptr) {}
};
// 构建完全二叉树的示例
TreeNode* buildCompleteBinaryTree() {
// 构建示例完全二叉树
// 1
// / \
// 2 3
// / \
// 4 5
TreeNode *root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
root->left->left = new TreeNode(4);
root->left->right = new TreeNode(5);
return root;
}
// 释放完全二叉树占用的内存
void deleteTree(TreeNode* node) {
if (node) {
deleteTree(node->left);
deleteTree(node->right);
delete node;
}
}
使用数组实现完全二叉树使用数组实现完全二叉树时,可以利用数组的索引特性来简化子节点的访问。 #include <vector>
#include <iostream>
class CompleteBinaryTree {
private:
std::vector<int> tree;
public:
// 构造函数,初始化空的完全二叉树
CompleteBinaryTree() {}
// 插入节点
void insert(int value, int level, int index) {
if (level >= (int)tree.size()) {
tree.resize((level + 1) * 2, 0); // 确保数组足够大
}
tree[level * 2 + index] = value; // 插入值
}
// 打印树的层序遍历
void printLevelOrder() {
for (int i = 0; i < tree.size(); ++i) {
std::cout << tree[i] << " ";
}
std::cout << std::endl;
}
// 释放数组占用的内存(vector会自动管理内存,这里仅为示例)
~CompleteBinaryTree() {
tree.clear();
}
};
// 构建完全二叉树的示例
void buildCompleteBinaryTreeArray(CompleteBinaryTree& cbt) {
// 构建示例完全二叉树
// 假设level为层,index为该层的索引
cbt.insert(1, 0, 0); // 根节点
cbt.insert(2, 1, 0); // 第一层,第一个节点
cbt.insert(3, 1, 1); // 第一层,第二个节点
cbt.insert(4, 2, 0); // 第二层,第一个节点
cbt.insert(5, 2, 1); // 第二层,第二个节点
}
int main() {
CompleteBinaryTree cbt;
buildCompleteBinaryTreeArray(cbt);
cbt.printLevelOrder(); // 打印层序遍历结果
return 0;
}
在数组实现中,我们使用level 和index 来确定节点在数组中的位置。level 表示节点所在的层,index 表示在该层中的索引。数组中的每个元素可以看作是一个节点,数组的索引可以转换为层和索引。 请注意,数组实现的完全二叉树通常需要预先知道树的最大高度,以便分配足够大的数组。在实际应用中,数组的大小可以根据需要动态调整。
(责任编辑:admin) |