王道计算机机试——建立二叉排序树

王道计算机机试——建立二叉排序树

1.题目描述

输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。
输入:输入第一行包括一个整数 n(1<=n<=100)。接下来的一行包括 n 个整数。
输出:可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树, 并对二叉排序树进行前序、中序和后序遍历。每种遍历结果输出一行。

2.思路讲解

二叉排序树是一棵特殊的二叉树,它是一棵二叉树但同时满足如下条件:对 于树上任意一个结点,其上的数值必大于等于其左子树上任意结点数值,必小于 等于其右子树上任意结点的数值。 二叉排序树的存储方式与二叉树保持一致,我们更多的关注它独有的操作。 我们从二叉树的插入开始了解其建树方式,对二叉排序树插入数字 x: 1.若当前树为空,则 x 为其根结点。 2.若当前结点大于 x,则 x 插入其左子树;若当前结点小于 x,则 x 插入其 右子树; 若当前结点等于 x,则根据具体情况选择插入左右子树或者直接忽略 。 以插入 4、2、6、1、3 为例,其二叉排序树变化情况如下图。
建立二叉排序树
由于各个数字插入的顺序不同,所得到的二叉排序树的形态也很可能不同, 所以不同的插入顺序对二叉排序树的形态有重要的影响。但是,所有的二叉排序 树都有一个共同的特点: 若对二叉排序树进行中序遍历,那么其遍历结果必然是 一个递增序列,这也是二叉排序树名字的来由,通过建立二叉排序树就能对原无 序序列进行排序,并实现动态维护 。

3.代码

#include<iostream>
#include<string>
using namespace std;
struct Node {//二叉树结构体
	Node* lchild;//左儿子指针
	Node* rchild;//右儿子指针
	int c;//保存数字
}Tree[100];//静态数组
int loc;//静态数组中被使用的元素个数
Node* creat() {//申请未使用的节点
	Tree[loc].lchild = Tree[loc].rchild = NULL;
	return &Tree[loc++];
}
void postOrder(Node* T) {//后序遍历
	if (T->lchild != NULL) {
		postOrder(T->lchild);
	}
	if (T->rchild != NULL) {
		postOrder(T->rchild);
	}
	cout << T->c;
}
void inOrder(Node* T) {//中序遍历
	if (T->lchild != NULL) {
		inOrder(T->lchild);
	}
	cout << T->c;
	if (T->rchild != NULL) {
		inOrder(T->rchild);
	}
}
void preOrder(Node* T) {//前序遍历
	cout << T->c;
	if (T->lchild != NULL) {
		preOrder(T->lchild);
	}
	if (T->rchild != NULL) {
		preOrder(T->rchild);
	}
}
Node* Insert(Node* T, int x) {//插入数字
	if (T == NULL) {//若当前数字为空
		T = creat();
		T->c = x;//数字直接插入其根节点
		return T;//返回其根节点指针
	}
	else if (x < T->c)//若x小于根节点数值
		T->lchild = Insert(T->lchild, x);//插入到左子树上
	else if (x > T->c)//若x大于根节点数值
		T->rchild = Insert(T->rchild, x);//插入到右子树上
	return T;
}
int main() {
	int n;
	while (cin >> n) {
		loc = 0;
		Node* T = NULL;//二叉排序树根节点为空
		for (int i = 0; i < n; i++) {
			int x;
			cin >> x;
			T = Insert(T, x);//插入到排序树中
		}
		preOrder(T);
		cout << endl;
		inOrder(T);
		cout << endl;
		postOrder(T);
		cout << endl;
	}
	return 0;
}



发布了12 篇原创文章 · 获赞 12 · 访问量 170

猜你喜欢

转载自blog.csdn.net/xyzxyzxyz1999/article/details/104858693
今日推荐