活动介绍

编写程序binarytree.cpp,实现二叉树的各种基本运算(假设二叉树中的数据类型为char),并在此基础上设计主程序main.cpp,完成如下功能: 1.输出二叉树; 2.输出H节点的左、右孩子的节点值; 3.输出二叉树的深度; 4.输出二叉树的宽度; 5.输出二叉树的节点个数; 6.输出二叉树的叶子节点个数; 7.释放二叉树。

时间: 2025-06-01 12:05:59 浏览: 21
### 二叉树基本运算的C++实现 以下是一个完整的C++实现,涵盖了二叉树的基本运算,包括输出二叉树、节点操作、深度、宽度、节点计数、叶子节点计数以及释放二叉树的功能。 #### 节点结构定义 在C++中,可以使用`struct`定义二叉树的节点结构。每个节点包含一个数据成员和两个指针成员,分别指向左子树和右子树[^1]。 ```cpp #include <iostream> #include <queue> using namespace std; typedef struct TreeNode { char data; TreeNode* left; TreeNode* right; TreeNode(char val) : data(val), left(nullptr), right(nullptr) {} } TreeNode; ``` #### 创建二叉树 可以通过递归或层次遍历的方式创建二叉树。以下代码通过层次遍历创建二叉树[^1]。 ```cpp TreeNode* createTree() { char ch; cin >> ch; if (ch == '#') return nullptr; // 使用 '#' 表示空节点 TreeNode* root = new TreeNode(ch); root->left = createTree(); root->right = createTree(); return root; } ``` #### 输出二叉树(前序、中序、后序遍历) 以下是三种常见的遍历方式:前序、中序和后序遍历。 ```cpp void preorder(TreeNode* root) { // 前序遍历 if (root == nullptr) return; cout << root->data << " "; preorder(root->left); preorder(root->right); } void inorder(TreeNode* root) { // 中序遍历 if (root == nullptr) return; inorder(root->left); cout << root->data << " "; inorder(root->right); } void postorder(TreeNode* root) { // 后序遍历 if (root == nullptr) return; postorder(root->left); postorder(root->right); cout << root->data << " "; } ``` #### 计算二叉树的深度 通过递归计算二叉树的深度。当根节点为空时,深度为0;否则,深度等于左右子树较大深度加1[^2]。 ```cpp int getDepth(TreeNode* root) { if (root == nullptr) return 0; int leftDepth = getDepth(root->left); int rightDepth = getDepth(root->right); return max(leftDepth, rightDepth) + 1; } ``` #### 计算二叉树的宽度 宽度是二叉树每一层节点数的最大值。可以通过层次遍历实现[^3]。 ```cpp int getWidth(TreeNode* root) { if (root == nullptr) return 0; queue<TreeNode*> q; q.push(root); int maxWidth = 0; while (!q.empty()) { int size = q.size(); maxWidth = max(maxWidth, size); for (int i = 0; i < size; ++i) { TreeNode* node = q.front(); q.pop(); if (node->left) q.push(node->left); if (node->right) q.push(node->right); } } return maxWidth; } ``` #### 计算节点总数 通过递归统计所有节点的数量[^4]。 ```cpp int getNodeCount(TreeNode* root) { if (root == nullptr) return 0; return getNodeCount(root->left) + getNodeCount(root->right) + 1; } ``` #### 计算叶子节点数 通过递归统计叶子节点的数量。叶子节点是指左右子树均为`nullptr`的节点[^5]。 ```cpp int getLeafCount(TreeNode* root) { if (root == nullptr) return 0; if (root->left == nullptr && root->right == nullptr) return 1; return getLeafCount(root->left) + getLeafCount(root->right); } ``` #### 释放二叉树 通过后序遍历释放所有节点的内存[^6]。 ```cpp void destroyTree(TreeNode* root) { if (root == nullptr) return; destroyTree(root->left); destroyTree(root->right); delete root; } ``` #### 主函数示例 以下是一个简单的主函数示例,用于测试上述功能。 ```cpp int main() { TreeNode* root = createTree(); cout << "前序遍历: "; preorder(root); cout << endl; cout << "中序遍历: "; inorder(root); cout << endl; cout << "后序遍历: "; postorder(root); cout << endl; cout << "树的深度: " << getDepth(root) << endl; cout << "树的宽度: " << getWidth(root) << endl; cout << "节点总数: " << getNodeCount(root) << endl; cout << "叶子节点数: " << getLeafCount(root) << endl; destroyTree(root); return 0; } ``` ###
阅读全文

相关推荐