实验要求
1、遍历二叉树。
请输入一棵二叉树的扩展的前序序列,经过处理后生成一棵二叉树,然后对于该二叉树输出中序和后序遍历序列。
2、按层次遍历二叉树。
1. 需求分析
该程序的设计任务是实现一个二叉树的遍历,包括中序、后序遍历以及按层次遍历。用户需输入一棵二叉树的扩展前序序列,程序通过处理该序列生成对应的二叉树,并输出中序、后序和按层次遍历的序列结果。
2. 概要设计
(1)抽象数据类型的定义
TreeNode: 二叉树节点结构体,包含数据域和左右子树指针。
(2)主程序流程
① 用户输入二叉树的扩展前序序列。
② 创建二叉树。
③ 执行中序、后序和按层次遍历。
④ 输出遍历结果。
(3)程序模块之间的调用关系
① createBinaryTree: 递归生成二叉树。
② inorderTraversal: 中序遍历二叉树。
③ postorderTraversal: 后序遍历二叉树。
④ levelOrderTraversal: 按层次遍历二叉树。
3. 详细设计
(1)createBinaryTree 函数:
接收输入的扩展前序序列和索引,递归生成二叉树,根据输入的字符构建节点和左右子树。
(2)inorderTraversal 函数:
递归实现中序遍历:左子树 -> 根节点 -> 右子树。
(3)postorderTraversal 函数:
递归实现后序遍历:左子树 -> 右子树 -> 根节点。
(4)levelOrderTraversal 函数:
使用队列实现按层次遍历:从根节点开始,依次将每层节点入队并输出数据,然后将其子节点入队。
4. 调试分析
(1)调试问题:
可能出现的问题包括输入错误导致的二叉树生成错误,以及遍历算法的实现逻辑问题。
(2)解决方法:
通过逐步打印调试信息来检查算法的正确性,确保节点的连接和遍历顺序正确。
5. 测试结果
(1)输入:
扩展前序序列: "ABD###CE##F"
(2)输出:
中序遍历序列: "D B A E C F"
后序遍历序列: "D B E F C A"
按层次遍历序列: "A B C D E F"
![](https://i-blog.csdnimg.cn/direct/2c9147188f9547b489062b2017293414.png)
6.完整代码
#include <iostream>
#include <queue>
using namespace std;
// 定义二叉树节点
struct TreeNode {
char data;
TreeNode* left;
TreeNode* right;
TreeNode(char val) : data(val), left(nullptr), right(nullptr) {}
};
// 生成二叉树
TreeNode* createBinaryTree(string& str, int& index) {
if (index >= str.length() || str[index] == '#') {
index++;
return nullptr;
}
TreeNode* root = new TreeNode(str[index]);
index++;
root->left = createBinaryTree(str, index);
root->right = createBinaryTree(str, index);
return root;
}
// 中序遍历二叉树
void inorderTraversal(TreeNode* root) {
if (root == nullptr) return;
inorderTraversal(root->left);
cout << root->data << " ";
inorderTraversal(root->right);
}
// 后序遍历二叉树
void postorderTraversal(TreeNode* root) {
if (root == nullptr) return;
postorderTraversal(root->left);
postorderTraversal(root->right);
cout << root->data << " ";
}
// 按层次遍历二叉树
void levelOrderTraversal(TreeNode* root) {
if (root == nullptr) return;
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* current = q.front();
q.pop();
cout << current->data << " ";
if (current->left != nullptr)
q.push(current->left);
if (current->right != nullptr)
q.push(current->right);
}
}
int main() {
string input;
cout << "请输入二叉树的扩展的前序序列(如:ABD###CE##F):";
cin >> input;
int index = 0;
TreeNode* root = createBinaryTree(input, index);
cout << "中序遍历序列:";
inorderTraversal(root);
cout << endl;
cout << "后序遍历序列:";
postorderTraversal(root);
cout << endl;
cout << "按层次遍历序列:";
levelOrderTraversal(root);
cout << endl;
return 0;
}
***本实验报告属原创,各位可以免费取用,严禁商用