CUMT数据结构:二叉排序树

题目描述
输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。

输入
输入第一行包括一个整数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;
}

你可能感兴趣的:(CMUTOJ)