帮我改进一下先序 中序 后序 层序的函数
时间: 2024-12-21 14:30:26 浏览: 13
当然可以。为了优化这些遍历函数,我们可以考虑将一些共性的部分提取出来,比如节点处理、递归终止条件等。这里是一个简化版的通用函数模板,你可以基于这个模板针对每种遍历方式进行具体的实现:
```cpp
template<typename Node, typename VisitFunc>
void traverse(Node* root, VisitFunc visit, bool (*isLeaf)(const Node*)) {
if (root == nullptr) {
return;
}
// 先序遍历(根-左-右)
visit(root);
traverse(root->left, visit, isLeaf);
traverse(root->right, visit, isLeaf);
// 中序遍历(左-根-右)
if (!isLeaf(root)) {
traverse(root->left, visit, isLeaf);
visit(root);
traverse(root->right, visit, isLeaf);
}
// 后序遍历(左-右-根)
if (!isLeaf(root)) {
traverse(root->left, visit, isLeaf);
traverse(root->right, visit, isLeaf);
visit(root);
}
// 层次遍历(非递归版本)
std::queue<Node*> queue;
queue.push(root);
while (!queue.empty()) {
Node* node = queue.front();
queue.pop();
visit(node);
if (node->left) {
queue.push(node->left);
}
if (node->right) {
queue.push(node->right);
}
}
}
```
在这个模板中,`VisitFunc`是你自定义的函数,用于处理每个节点;`isLeaf`是一个函数指针,用来判断当前节点是否为叶子节点。你可以根据需要自定义这两个参数。
接下来,你可以分别写出先序、中序、后序遍历的具体实现,只需要替换`visit`函数即可:
1. 先序遍历:
```cpp
void preorder(Node* root, VisitFunc visit) {
traverse(root, visit, [] (const Node* node) { return node->left == nullptr && node->right == nullptr; });
}
```
2. 中序遍历:
```cpp
void inorder(Node* root, VisitFunc visit) {
traverse(root, visit, [] (const Node* node) { return node->left != nullptr; });
}
```
3. 后序遍历:
```cpp
void postorder(Node* root, VisitFunc visit) {
traverse(root, visit, [] (const Node* node) { return node->left != nullptr || node->right != nullptr; });
}
```
4. 层次遍历(已经给出在上面的模板里)。
记得替换`Node`为你实际的二叉树节点类型。这样,当你需要改变遍历方式时,只需修改相应的`traverse`调用即可。
阅读全文