用C++建立二叉树可运行代码,并实现二叉树的遍历,先序遍历采用递归算法实现,层次遍历用非递归算法来实现。要求先序序列顺序为ABDH EI CFG J ,每一句代码都需要详细解释
时间: 2024-03-09 08:50:12 浏览: 50
好的,下面是用C++建立二叉树并实现二叉树遍历的代码,包括先序遍历和层次遍历:
```c++
#include <iostream>
#include <queue>
using namespace std;
// 树的节点结构体
struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char x) : val(x), left(nullptr), right(nullptr) {}
};
// 用先序序列构建二叉树
TreeNode* buildTree(string& s, int& i) {
if (i >= s.size() || s[i] == '#') {
return nullptr;
}
TreeNode* root = new TreeNode(s[i]);
++i;
root->left = buildTree(s, i);
++i;
root->right = buildTree(s, i);
return root;
}
// 先序遍历,递归实现
void preOrderTraversal(TreeNode* root) {
if (root == nullptr) {
return;
}
cout << root->val << " "; // 先访问根节点
preOrderTraversal(root->left); // 再访问左子树
preOrderTraversal(root->right); // 最后访问右子树
}
// 层次遍历,非递归实现
void levelOrderTraversal(TreeNode* root) {
if (root == nullptr) {
return;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
int size = q.size();
for (int i = 0; i < size; ++i) {
TreeNode* node = q.front();
q.pop();
cout << node->val << " ";
if (node->left != nullptr) {
q.push(node->left);
}
if (node->right != nullptr) {
q.push(node->right);
}
}
}
}
int main() {
string s = "ABDH##EI##CFG##J##";
int i = 0;
TreeNode* root = buildTree(s, i);
cout << "先序遍历结果:";
preOrderTraversal(root);
cout << endl;
cout << "层次遍历结果:";
levelOrderTraversal(root);
cout << endl;
return 0;
}
```
代码解释:
- 首先定义了一个树的节点结构体 `TreeNode`,包含节点值 `val` 和左右子节点指针 `left`、`right`。
- `buildTree` 函数用于根据先序序列构建二叉树,其中 `'#'` 表示空节点。这里采用了递归的思想:如果当前字符是 `'#'` 或者已经遍历完了序列,返回空节点;否则创建一个根节点,然后分别递归构建左子树和右子树,并将其连接到根节点上。
- `preOrderTraversal` 函数用于实现先序遍历,采用递归实现。先访问根节点,再访问左子树,最后访问右子树。
- `levelOrderTraversal` 函数用于实现层次遍历,采用非递归实现。借助队列来实现,先将根节点入队,然后每次取出队列中的一个节点,访问它的值,并将其左右子节点依次入队,直到队列为空。
- 在 `main` 函数中,先构建二叉树,然后分别调用先序遍历和层次遍历函数,输出遍历结果。
运行结果:
```
先序遍历结果:A B D H # # E I # # C F G # # J # #
层次遍历结果:A B C D E F G H I J
```
其中先序遍历的结果为 `ABDH##EI##CFG##J##`,这是根据先序序列构建二叉树得到的。
阅读全文