编写完整的C++语言程序完成下列实验任务:采用二叉链表的方式进行存储 构造一个二叉树类 根据扩展二叉树的前序遍历序列建立二叉链表 统计树中结点个数 统计树中叶子结点个数 统计树的高度 二叉树左右子树的交换
时间: 2024-12-16 17:17:38 浏览: 2
二叉树的应用:二叉排序树BST和平衡二叉树AVL的构造 课设作业 完整代码
5星 · 资源好评率100%
在C++中,我们可以创建一个二叉树结构并实现所需的函数。首先,我们需要定义一个简单的二叉链表节点结构:
```cpp
// 定义二叉链表节点
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
```
接下来,我们可以创建一个二叉树类,包含基本操作以及统计功能:
```cpp
class BinaryTree {
private:
TreeNode* root;
public:
// 构造函数
BinaryTree() : root(nullptr) {}
// 插入节点
void insert(int value) {
if (!root) {
root = new TreeNode(value);
} else {
insertNode(root, value);
}
}
// 插入节点到指定位置
void insertNode(TreeNode*& node, int value) {
if (value < node->val) {
if (node->left == nullptr) {
node->left = new TreeNode(value);
} else {
insertNode(node->left, value);
}
} else {
if (node->right == nullptr) {
node->right = new TreeNode(value);
} else {
insertNode(node->right, value);
}
}
}
// 前序遍历(根-左-右)
void preOrderTraversal(TreeNode* node, vector<int>& result) {
if (node != nullptr) {
result.push_back(node->val);
preOrderTraversal(node->left, result);
preOrderTraversal(node->right, result);
}
}
// 其他统计函数
int countNodes() const {
return countNodesHelper(root);
}
int countLeaves() const {
return countLeavesHelper(root);
}
int height() const {
return heightHelper(root);
}
private:
int countNodesHelper(TreeNode* node) const {
if (node == nullptr) return 0;
return 1 + countNodesHelper(node->left) + countNodesHelper(node->right);
}
int countLeavesHelper(TreeNode* node) const {
if (node == nullptr) return 0;
return (node->left == nullptr && node->right == nullptr) ? 1 : countLeavesHelper(node->left) + countLeavesHelper(node->right);
}
int heightHelper(TreeNode* node) const {
if (node == nullptr) return -1;
int leftHeight = heightHelper(node->left);
int rightHeight = heightHelper(node->right);
return max(leftHeight, rightHeight) + 1;
}
// 左右子树交换
void swapChildren(TreeNode*& node) {
if (node->left != nullptr && node->right != nullptr) {
auto temp = node->left;
node->left = node->right;
node->right = temp;
}
}
};
```
现在你可以使用这个`BinaryTree`类来构建二叉树、执行前序遍历、计算节点数、叶子数和高度,并交换子树。例如:
```cpp
int main() {
BinaryTree tree;
tree.insert(5); // 插入根节点
tree.insert(3);
tree.insert(7);
tree.insert(2);
tree.insert(4);
tree.insert(6);
tree.insert(8);
// 执行相关操作...
vector<int> preorder;
tree.preOrderTraversal(tree.root, preorder);
cout << "Preorder traversal: ";
for (const auto& val : preorder) {
cout << val << " ";
}
cout << endl;
// 计算节点数、叶子数和高度
int total_nodes = tree.countNodes();
int leaves = tree.countLeaves();
int height = tree.height();
cout << "Total nodes: " << total_nodes << ", Leaves: " << leaves << ", Height: " << height << endl;
// 子树交换
tree.swapChildren(tree.root);
// 更多处理...
return 0;
}
```
阅读全文