1. 编写程序实现二叉树的先序、中序、后序、层序遍历; 2. 对二叉树实现求深度、层数运算; 三、实验要求 二叉树可以任意输入建立并显示二叉树;能友好的显示各种结果; 对于二叉树的输入,空用“^”表示。 首先输入一个二叉树。然后输出: 先序遍历结果“=:先序遍历结果回车”; 中序遍历结果“=:中序遍历结果回车”; 后序遍历结果“=:后序遍历结果回车”; 层序遍历结果“=:层序遍历结果回车”; 叶子数“=:叶子数” 树的深度“=:树的深度回车”。
时间: 2023-09-08 11:14:49 浏览: 137
好的,这里给出一个完整的实现,包括输入二叉树、遍历、求深度和叶子节点数等功能。代码如下:
```C++
#include <iostream>
#include <vector>
#include <string>
#include <queue>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x): val(x), left(nullptr), right(nullptr) {};
};
// 先序遍历
void preorderTraversal(TreeNode* root, vector<int>& res) {
if (root == nullptr) return;
res.push_back(root->val);
preorderTraversal(root->left, res);
preorderTraversal(root->right, res);
}
// 中序遍历
void inorderTraversal(TreeNode* root, vector<int>& res) {
if (root == nullptr) return;
inorderTraversal(root->left, res);
res.push_back(root->val);
inorderTraversal(root->right, res);
}
// 后序遍历
void postorderTraversal(TreeNode* root, vector<int>& res) {
if (root == nullptr) return;
postorderTraversal(root->left, res);
postorderTraversal(root->right, res);
res.push_back(root->val);
}
// 层序遍历
void levelorderTraversal(TreeNode* root, vector<int>& res) {
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* cur = q.front();
q.pop();
res.push_back(cur->val);
if (cur->left) q.push(cur->left);
if (cur->right) q.push(cur->right);
}
}
}
// 求深度
int maxDepth(TreeNode* root) {
if (root == nullptr) return 0;
int leftDepth = maxDepth(root->left);
int rightDepth = maxDepth(root->right);
return max(leftDepth, rightDepth) + 1;
}
// 求叶子节点数
int leafCount(TreeNode* root) {
if (root == nullptr) return 0;
if (root->left == nullptr && root->right == nullptr) return 1;
return leafCount(root->left) + leafCount(root->right);
}
int main() {
// 输入二叉树
cout << "请输入二叉树,空节点用^表示:" << endl;
string s;
cin >> s;
TreeNode* root = nullptr;
queue<TreeNode*> q;
if (s != "^") {
int val = stoi(s);
root = new TreeNode(val);
q.push(root);
}
int i = 1;
while (!q.empty() && i < s.size()) {
TreeNode* cur = q.front();
q.pop();
if (i < s.size() && s[i] != '^') {
int val = stoi(s.substr(i, 1));
cur->left = new TreeNode(val);
q.push(cur->left);
}
i += 2;
if (i < s.size() && s[i] != '^') {
int val = stoi(s.substr(i, 1));
cur->right = new TreeNode(val);
q.push(cur->right);
}
i += 2;
}
// 遍历二叉树
vector<int> res;
preorderTraversal(root, res);
cout << "先序遍历结果=:";
for (int i = 0; i < res.size(); i++) {
cout << res[i] << " ";
}
cout << endl;
res.clear();
inorderTraversal(root, res);
cout << "中序遍历结果=:";
for (int i = 0; i < res.size(); i++) {
cout << res[i] << " ";
}
cout << endl;
res.clear();
postorderTraversal(root, res);
cout << "后序遍历结果=:";
for (int i = 0; i < res.size(); i++) {
cout << res[i] << " ";
}
cout << endl;
res.clear();
levelorderTraversal(root, res);
cout << "层序遍历结果=:";
for (int i = 0; i < res.size(); i++) {
cout << res[i] << " ";
}
cout << endl;
// 求深度和叶子节点数
cout << "叶子数=: " << leafCount(root) << endl;
cout << "树的深度=: " << maxDepth(root) << endl;
return 0;
}
```
输入格式为一串数字和字符 '^' 组成的字符串,表示二叉树的形状。例如,输入字符串 "1^23" 表示如下的二叉树:
```
1
/ \
2 3
```
输出格式按照题目要求输出,例如:
```
请输入二叉树,空节点用^表示:
1^23
先序遍历结果=:1 2 3
中序遍历结果=:2 1 3
后序遍历结果=:2 3 1
层序遍历结果=:1 2 3
叶子数=: 2
树的深度=: 2
```
希望这个程序能够帮助到您!
阅读全文