题目描述
描述
输入一系列整数,建立二叉排序树,并进行前序,中序,后序遍历。
输入描述:
输入第一行包括一个整数n(1<=n<=100)。 接下来的一行包括n个整数。
输出描述:
可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。 每种遍历结果输出一行。每行最后一个数据之后有一个换行。 输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。
示例
输入
5
1 6 5 9 8
输出
1 6 5 9 8
1 5 6 8 9
5 8 9 6 1
题目解答
题目分析
代码中定义了一个结构体 TreeNode,用于表示二叉排序树的节点。二叉排序树是一种特殊的二叉树,它满足以下性质:
- 对于树中的每个节点,它的左子树中的所有节点的值都小于该节点的值。
- 对于树中的每个节点,它的右子树中的所有节点的值都大于该节点的值。
- 左右子树都是二叉排序树。
TreeNode 结构体的成员如下所示:
struct TreeNode {
int data; // 存储节点的数据值
TreeNode* leftchild; // 指向左子树的指针
TreeNode* rightchild;// 指向右子树的指针
TreeNode(int x) // 构造函数,用于初始化节点的数据值和子树指针
: data(x), leftchild(NULL), rightchild(NULL) {}
};
int data;:存储节点的数据值。TreeNode* leftchild;:是指向左子树的指针。TreeNode* rightchild;:是指向右子树的指针。TreeNode(int x):一个构造函数,用于创建TreeNode类型的对象。构造函数接受一个整数参数x,并将其赋值给节点的数据值data。同时,左右子树的指针被初始化为NULL,表示新创建的节点暂时没有左右子树。
在 C++ 中,构造函数的主要目的是在对象被创建时对其进行初始化。构造函数可以带有参数,也可以没有参数。当没有参数时,可以用一对空的大括号 {} 表示。
在本题的代码中,构造函数的定义如下:
cppCopy code
TreeNode(int x): data(x), leftchild(NULL), rightchild(NULL) {}
这里,data(x)、leftchild(NULL) 和 rightchild(NULL) 是成员初始化列表,用于给成员变量赋初值。而最后的一对大括号 {} 表示构造函数体,即在对象被创建时要执行的具体操作。
如果构造函数没有其他需要执行的操作,那么这一对空的大括号可以省略。
题解
#include <bits/stdc++.h>
using namespace std;
// 二叉排序树
struct TreeNode {
int data;
TreeNode *leftchild;
TreeNode *rightchild;
TreeNode(int x) : data(x), leftchild(NULL), rightchild(NULL) {}
};
void visit(TreeNode *t) {
cout << t->data << " ";
}
void PreOrder(TreeNode *root) {
if (root == NULL) {
return;
}
visit(root);
PreOrder(root->leftchild);
PreOrder(root->rightchild);
}
void InOrder(TreeNode *root)
{
if (root == NULL) {
return;
}
InOrder(root->leftchild);
visit(root);
InOrder(root->rightchild);
return;
}
void PostOrder(TreeNode *root)
{
if (root == NULL) {
return;
}
PostOrder(root->leftchild);
PostOrder(root->rightchild);
visit(root);
return;
}
TreeNode *Insert(TreeNode *root, int x) {
if (root == NULL) {
root = new TreeNode(x);
}
if (x == root->data)
;
else if (x < root->data)
root->leftchild = Insert(root->leftchild, x);
else
root->rightchild = Insert(root->rightchild, x);
return root;
}
int main() {
int n;
// cin 的输入运算符 >> 返回一个值,该值在成功读取输入时为真,否则为假。
while (cin >> n) {
TreeNode *root = NULL;
while (n--) {
int x;
cin >> x;
root = Insert(root, x);
}
PreOrder(root);
cout << endl;
InOrder(root);
cout << endl;
PostOrder(root);
cout << endl;
}
return 0;
}