编写完整的C++语言程序完成下列实验任务:采用二叉链表的方式进行存储 构造一个二叉树类 根据扩展二叉树的前序遍历序列建立二叉链表 复习本PPT中幻灯片P3-P11,实现以下算法: 1.统计树中结点个数 2.统计树中叶子结点个数 3.统计树的高度 4.二叉树左右子树的交换
时间: 2024-12-12 20:25:41 浏览: 4
二叉树的应用:二叉排序树BST和平衡二叉树AVL的构造 课设作业 完整代码
5星 · 资源好评率100%
首先,我们需要创建一个二叉链表节点结构体以及二叉树类。以下是简单的C++代码实现:
```cpp
#include <iostream>
// 定义二叉链表节点
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
// 定义二叉树类
class BinaryTree {
public:
BinaryTree() : root(nullptr) {}
// 添加新节点
void insert(int value) {
if (!root) {
root = new TreeNode(value);
} else {
addNode(root, value);
}
}
private:
void addNode(TreeNode*& cur, int value) {
if (value < cur->val) {
if (cur->left) {
addNode(cur->left, value);
} else {
cur->left = new TreeNode(value);
}
} else {
if (cur->right) {
addNode(cur->right, value);
} else {
cur->right = new TreeNode(value);
}
}
}
// 扩展二叉树的前序遍历
std::string preOrderTraversal(TreeNode* node, std::stringstream& ss) const {
if (node == nullptr) return "";
ss << node->val << " ";
ss << preOrderTraversal(node->left, ss);
ss << preOrderTraversal(node->right, ss);
return ss.str();
}
// 根据前序遍历序列构建二叉树
static BinaryTree buildFromPreorder(const std::vector<int>& preorder) {
BinaryTree tree;
if (preorder.empty()) return tree;
for (int i = 0; i < preorder.size(); ++i) {
if (i > 0 && preorder[i] < preorder[0]) break;
tree.insert(preorder[i]);
}
return tree;
}
// 实现其他算法
int countNodes() const { return countNodesHelper(root); }
int countLeaves() const { return countLeavesHelper(root); }
int height() const { return heightHelper(root); }
void swapSubtrees(TreeNode*& left, TreeNode*& right) {
TreeNode* temp = left;
left = right;
right = temp;
}
private:
static int countNodesHelper(TreeNode* node) {
if (node == nullptr) return 0;
return 1 + countNodesHelper(node->left) + countNodesHelper(node->right);
}
static int countLeavesHelper(TreeNode* node) {
if (node == nullptr) return 0;
return (node->left == nullptr && node->right == nullptr) ? 1 : countLeavesHelper(node->left) + countLeavesHelper(node->right);
}
static int heightHelper(TreeNode* node) {
if (node == nullptr) return 0;
int leftHeight = heightHelper(node->left);
int rightHeight = heightHelper(node->right);
return std::max(leftHeight, rightHeight) + 1;
}
TreeNode* root;
};
```
在这个代码中,我们实现了二叉树的基本操作如插入、前序遍历以及一些辅助函数来计算节点总数、叶子节点数、树的高度,并提供了交换左右子树的功能。
现在你可以根据需要使用这个`BinaryTree`类来进行上述实验任务。例如,创建一个二叉树并执行算法:
```cpp
int main() {
std::vector<int> preorder = {5, 3, 7, 2, 4, 6, 8};
BinaryTree tree = BinaryTree::buildFromPreorder(preorder);
std::cout << "节点总数: " << tree.countNodes() << "\n";
std::cout << "叶子节点数: " << tree.countLeaves() << "\n";
std::cout << "树的高度: " << tree.height() << "\n";
// 模拟交换子树
TreeNode* left = &tree.root->left;
TreeNode* right = &tree.root->right;
tree.swapSubtrees(left, right);
// 输出交换后的树的信息
// ...
return 0;
}
```
阅读全文