树的存储和遍历(必做题)(1)编码实现树的两种存储结构:双亲表示法和孩子表示法;(2)基于树的孩子表示法实现树的前序遍历、后序遍历和层序遍历;(3)求解树的深度。编写出满足以上题目要求的C++完整代码
时间: 2024-10-12 13:07:54 浏览: 47
在C++中,我们可以分别实现二叉树的双亲表示法和孩子表示法,并利用孩子表示法进行树的遍历以及计算深度。这里提供一个简单的示例:
**(1)双亲表示法(也称为指针表示法)**
```cpp
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
```
在这个结构体中,`left` 和 `right` 分别指向左孩子和右孩子。
**(2)孩子表示法**
```cpp
struct TreeNode {
int val;
std::vector<TreeNode*> children; // 孩子节点数组
TreeNode(int x) : val(x) {}
};
```
在这里,我们用一个`std::vector<TreeNode*>`来存储所有孩子节点。
**(3)遍历**
- 前序遍历(根-左-右)
```cpp
void preOrder(TreeNode* root) {
if (root != nullptr) {
cout << root->val << " ";
for (TreeNode* child : root->children) {
preOrder(child);
}
}
}
```
- 后序遍历(左-右-根)
```cpp
void postOrder(TreeNode* root) {
if (root != nullptr) {
for (TreeNode* child : root->children) {
postOrder(child);
}
cout << root->val << " ";
}
}
```
- 层序遍历(逐层从左到右)
```cpp
void levelOrder(TreeNode* root) {
if (root == nullptr) return;
std::queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* node = q.front();
q.pop();
cout << node->val << " ";
for (TreeNode* child : node->children) {
q.push(child);
}
}
}
```
**(4)求树的深度**
```cpp
int maxDepth(TreeNode* root) {
if (root == nullptr) return 0;
int leftDepth = maxDepth(root->left);
int rightDepth = maxDepth(root->right);
return std::max(leftDepth, rightDepth) + 1;
}
```
以上就是基于孩子表示法的简单实现。需要注意的是,实际项目中可能需要对内存管理、异常处理等因素进行考虑。记得在完成上述操作后,对不再使用的节点进行恰当的清理以减少内存消耗。
阅读全文