从键盘接受输入扩展先序序列,以二叉链表作为存储结构,建立二叉树。并输出这棵二叉树的先序、中序和后序遍历序列。 二叉树结点的data是字符类型数据, 其中#表示空格字符。
时间: 2023-05-31 19:18:27 浏览: 202
后序遍历二叉树的非递归算法.doc
### 回答1:
这是关于二叉树的问题。题目给出了一个键盘输入的程序序列,并以二叉链表作为存储结构,建立了一个二叉树。然后需要输出这棵二叉树的先序、中序和后序遍历序列。该树中的结点数据是字符类型数据,其中#表示空格字符。
### 回答2:
输入先序序列指的是按照父节点、左子树、右子树的顺序输入每个节点的值,如果该节点没有子节点则输入一个特殊符号(如#)表示为空。
建立二叉树的方法是:从输入的序列中取出第一个节点作为根节点,如果该节点不为空,则继续读取下一个节点,如果该节点是空节点,则跳过当前节点,直到找到下一个非空节点作为左子树,然后在继续读取下一个节点,如果该节点是空节点,则跳过当前节点,直到找到下一个非空节点作为右子树。然后分别以左子树和右子树为根节点,递归建立子树,直到序列结束或者所有节点都被建立为止。
建立二叉树后,可以通过先序、中序、后序遍历的方式遍历整棵二叉树。先序遍历指的是先访问父节点,再访问左子树,最后访问右子树;中序遍历指的是先访问左子树,再访问父节点,最后访问右子树;后序遍历指的是先访问左子树,再访问右子树,最后访问父节点。
输出先序、中序、后序遍历序列的方法是:先定义一个数组用来存储遍历序列,然后递归遍历整棵二叉树,先把每个节点的值存入数组中,再以相应的遍历方式递归访问左子树和右子树,直到遍历完整棵树。最后输出数组中存储的序列即可。
总的来说,建立二叉树和遍历二叉树是二叉树算法中非常基础和重要的部分,通过这个问题的练习可以加深对二叉树的理解和掌握二叉树的算法思想。
### 回答3:
输入扩展先序序列的含义是按照先序遍历的顺序依次输入二叉树的结点信息,其中空节点用字符“#”表示。对于输入样例:AB#C##D#EF###,其对应的二叉树如下所示:
```
A
/ \
B C
/ \
# #
D E
/ /
# #
F #
```
根据先序遍历的方式构建该二叉树,根节点为A,依次遍历下一个结点B,接着遍历C,由于C有左右子节点,所以分别访问D和#,然后回到C结点,访问其右子节点E,再次回到C结点,由于C的左右子节点均已访问完毕,因此回到根节点A,访问其右子节点F,接着回到根节点A,整个树构建完成。
此时得到的二叉树的先序遍历序列为:ABCFED,中序遍历序列为:BACDFE,后序遍历序列为:BCFDAE。对于这棵二叉树,我们可以使用递归方式进行三种遍历操作,具体实现可以参考以下示例代码:
```
#include<iostream>
#include<cstring>
using namespace std;
// 定义二叉树结点类型
struct TreeNode {
char data;
TreeNode *left;
TreeNode *right;
TreeNode(char d = ' ') : data(d), left(nullptr), right(nullptr) {}
};
// 根据输入的扩展先序序列构建二叉树
void BuildTree(TreeNode *&node, char *str) {
if (*str == '\0') return; //输入序列已结束
if (*str == '#') node = nullptr; // 空节点
else {
node = new TreeNode(*str); // 构造新节点
BuildTree(node->left, ++str); // 构建左子树
BuildTree(node->right, ++str); // 构建右子树
}
}
// 递归先序遍历
void PreOrderPrint(TreeNode *node) {
if (node == nullptr) return;
cout << node->data;
PreOrderPrint(node->left);
PreOrderPrint(node->right);
}
// 递归中序遍历
void InOrderPrint(TreeNode *node) {
if (node == nullptr) return;
InOrderPrint(node->left);
cout << node->data;
InOrderPrint(node->right);
}
// 递归后序遍历
void PostOrderPrint(TreeNode *node) {
if (node == nullptr) return;
PostOrderPrint(node->left);
PostOrderPrint(node->right);
cout << node->data;
}
int main() {
char str[100];
cout << "请输入扩展先序序列:";
cin >> str;
TreeNode *root = nullptr;
BuildTree(root, str); // 构建二叉树
cout << "先序遍历结果:" ;
PreOrderPrint(root); // 先序遍历
cout << endl << "中序遍历结果:";
InOrderPrint(root); // 中序遍历
cout << endl << "后序遍历结果:";
PostOrderPrint(root); // 后序遍历
return 0;
}
```
以上代码中的BuildTree函数利用指针的引用机制,递归构建二叉树的树结构。调用时需要传入一个指向指针的引用,使其在递归过程中能够对指针进行操作,定义为空节点时直接将指针赋值为空即可。
另外,需要注意的是,输入的扩展先序序列必须是合法的二叉树代码,否则会构建错误的二叉树 ,导致输出的三种遍历结果异常。建议在输入时根据自己输入内容自行判断其是否合法。
阅读全文