题目描述
输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。
输入
输入第一行包括一个整数n(1<=n<=100)。接下来的一行包括n个整数。
输出
可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。每种遍历结果输出一行。每行最后一个数据之后有一个空格。
样例输入
1
2
2
8 15
4
21 10 5 39
样例输出
2
2
2
8 15
8 15
15 8
21 10 5 39
5 10 21 39
5 10 39 21
注:
1.二叉排序树,又名二叉搜索树,二叉查找树(我一开始真不知道二叉搜索树也叫二叉排序树)
2.本题核心很简单,分两块,第一步建立二叉排序树,第二部对其进行三种遍历输出
3.这是非递归算法,课表的方法是递归算法,因为我还没搞懂课本上类的写法,因为赶时间姑且写了个比较贴近c的简单一点的算法,后续我会尝试弄懂c++中类的写法并对本题代码进行完善
代码:
#include
using namespace std;
typedef struct BinaryTreeNode {
int data;
BinaryTreeNode* leftchild;
BinaryTreeNode* rightchild;
}BinaryTreeNode,*BST;
//二叉搜索树的插入/建立
BST Insert(int num, BST root)
{
if (root == NULL)
{
root = new BinaryTreeNode;
root->data = num;
root->leftchild = NULL;
root->rightchild = NULL;
}
else if (num < root->data)
root->leftchild = Insert(num, root->leftchild);
else if (num > root->data)
root->rightchild = Insert(num, root->rightchild);
else {}
return root;
}
//三种遍历代码,区别就是输出节点内容的时机
//自己写代码时应该会复制粘贴,但是记得改函数名(虽然我估计应该就我一个人会
//犯这种错误)我忘记改了后查了近20分钟才发现是没改函数名导致三个遍历其实调
//用的是同一个函数
void aftOrder(BST bt)
{
if (bt )
{
aftOrder(bt->leftchild);
aftOrder(bt->rightchild);
cout << bt->data<<" ";
}
}
void preOrder(BST bt)
{
if (bt != NULL)
{
cout << bt->data<<" ";
preOrder(bt->leftchild);
preOrder(bt->rightchild);
}
}
void midOrder(BST bt)
{
if (bt != NULL)
{
midOrder(bt->leftchild);
cout << bt->data<<" ";
midOrder(bt->rightchild);
}
}
int main()
{
int n;
while (cin >> n)
{
int p;
BST Tree = NULL;
for (int i = 0; i < n; i++)
{
cin >> p;
Tree=Insert(p,Tree);
}
preOrder(Tree);
cout << endl;
midOrder(Tree);
cout << endl;
aftOrder(Tree);
cout << endl;
}
return 0;
}