矿业大学 2022数据结构实验二

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

问题 A 满二叉树的前序遍历

题目描述

给你一个满二叉树的层次遍历序列,请编程输出该二叉树的前序遍历序列。

输入

第一行是n(n小于26),表示有n个节点。第二行是该满二叉树的节点对应字母的层次遍历序列。

输出

输出该满二叉数的前序遍历序列。

样例输入

3
B A C
样例输出

BAC

重点掌握二叉树的创建,数组比链表更简洁

#include<iostream>
using namespace std;
struct node {
	node* left, * right;
	char val; int num;
	node() {
		left = right = NULL;
		val = num = 0;
	}
};
int create(node* q, int max, char* x) {
	node* newnode;
	if (q->num * 2 + 1 > max)return -1;
	else {
		newnode = new node;
		newnode->num = q->num * 2 + 1;
		newnode->val = x[q->num * 2 + 1];
		q->left = newnode;
		create(q->left, max, x);
	}
	if (q->num * 2 + 2 > max)return -1;
	else {
		newnode = new node;
		newnode->num = q->num * 2 + 2;
		newnode->val = x[q->num * 2 + 2];
		q->right = newnode;
		create(q->right, max, x);
	}
}
void qx(node* x)
{
	cout << x->val;
	if (x->left != NULL) qx(x->left);
	if (x->right != NULL) qx(x->right);
}
int main() {
	int n; cin >> n;
	char* x = new char[n];
	for (int i = 0; i < n; i++)
		cin >> x[i];
	node* root = new node;
	root->val = x[0];
	root->num = 0;
	create(root, n - 1, x);
	qx(root);
}

简单的

#include<iostream>
using namespace std;
void qx(char *q,int n,int max) {
	cout << q[n];
	if(2*n+1<=max){
		qx(q, 2 * n + 1, max);
	}
	if(2*n+2<=max){
		qx(q, 2 * n + 2, max);
	}
}
int main() {
	int n; cin >> n;
	char* x = new char[n];
	for (int i = 0; i < n; i++)
		cin >> x[i];
	qx(x, 0, n - 1);
}

问题 B 满二叉树的中序遍历

题目描述

给你一个满二叉树的层次遍历序列,请编程输出该二叉树的中序遍历序列。

输入

第一行是n(n小于26),表示有n个节点。第二行是该满二叉树的节点对应字母的层次遍历序列。

输出

输出该满二叉数的中序遍历序列。

样例输入

3
B A C
样例输出

ABC

#include<iostream>
using namespace std;
struct node {
	node* left, * right;
	char val; int num;
	node() {
		left = right = NULL;
		val = num = 0;
	}
};
int create(node* q, int max, char* x) {
	node* newnode;
	if (q->num * 2 + 1 > max)return -1;
	else {
		newnode = new node;
		newnode->num = q->num * 2 + 1;
		newnode->val = x[q->num * 2 + 1];
		q->left = newnode;
		create(q->left, max, x);
	}
	if (q->num * 2 + 2 > max)return -1;
	else {
		newnode = new node;
		newnode->num = q->num * 2 + 2;
		newnode->val = x[q->num * 2 + 2];
		q->right = newnode;
		create(q->right, max, x);
	}
}
void zx(node* x)
{
	if (x->left != NULL) zx(x->left);
	cout << x->val;
	if (x->right != NULL) zx(x->right);
}
int main() {
	int n; cin >> n;
	char* x = new char[n];
	for (int i = 0; i < n; i++)
		cin >> x[i];
	node* root = new node;
	root->val = x[0];
	root->num = 0;
	create(root, n - 1, x);
	zx(root);
}

问题 C 满二叉树的后序遍历

题目描述

给你一个满二叉树的层次遍历序列,请编程输出该二叉树的后序遍历序列。

输入

第一行是n(n小于26),表示有n个节点。第二行是该满二叉树的节点对应字母的层次遍历序列。

输出

输出该满二叉数的后序遍历序列。

样例输入

3
B A C
样例输出

ACB

#include<iostream>
using namespace std;
struct node {
	node* left, * right;
	char val; int num;
	node() {
		left = right = NULL;
		val = num = 0;
	}
};
int create(node* q, int max, char* x) {
	node* newnode;
	if (q->num * 2 + 1 > max)return -1;
	else {
		newnode = new node;
		newnode->num = q->num * 2 + 1;
		newnode->val = x[q->num * 2 + 1];
		q->left = newnode;
		create(q->left, max, x);
	}
	if (q->num * 2 + 2 > max)return -1;
	else {
		newnode = new node;
		newnode->num = q->num * 2 + 2;
		newnode->val = x[q->num * 2 + 2];
		q->right = newnode;
		create(q->right, max, x);
	}
}
void hx(node* x)
{
	if (x->left != NULL) hx(x->left);
	if (x->right != NULL) hx(x->right);
	cout << x->val;
}
int main() {
	int n; cin >> n;
	char* x = new char[n];
	for (int i = 0; i < n; i++)
		cin >> x[i];
	node* root = new node;
	root->val = x[0];
	root->num = 0;
	create(root, n - 1, x);
	hx(root);
}

问题 D: 任意二叉树的前序遍历

题目描述

有若干个节点,每个节点上都有编号,把这些节点随意地构成二叉树,请编程输出该二叉树的前序遍历序列。

输入

第一行是n(n小于100),表示有n个节点,每个节点按从1到n依次编号。第一行后有n行,每行三个正整数i、l、r,分别表示节点i及对应的左右孩子的编号,如果不存在孩子则以-1表示。三个整数之间用一个空格隔开。

输出

输出该二叉数的前序遍历序列。

样例输入 Copy

4
1 2 4
3 1 -1
2 -1 -1
4 -1 -1
样例输出 Copy

3 1 2 4

#include<iostream>
using namespace std;
struct node {
	int left, right,root;
	int val;
	node() { left = right = root = val = -1; }
};
int findroot(node* q, int n) {
	for (int i = 0; i < n; i++) {
		if (q[i].left != -1)
		for (int j = 0; j < n; j++) {
			if (q[j].val == q[i].left) {
				q[j].root = i; q[i].left = j+100;
			}
		}
		if(q[i].right!=-1)
			for (int j = 0; j < n; j++) {
				if (q[j].val == q[i].right) {
					q[j].root = i; q[i].right = j+100;
				}
		}
	}
	for (int i = 0; i < n; i++)
		if (q[i].root == -1)
			return i;
}
void qx(int q,node *x) {
	cout << x[q].val << ' ';
	if (x[q].left != -1) {
		qx(x[q].left-100, x);
	}
	if (x[q].right != -1) {
		qx(x[q].right-100, x);
	}
}
int main() {
	int n; cin >> n;
	node* x = new node[n];
	for (int i = 0; i < n; i++) {
		cin >> x[i].val >> x[i].left >> x[i].right;
	}
	qx(findroot(x,n), x);
}

问题 E 任意二叉树的中序遍历

题目描述

有若干个节点,每个节点上都有编号,把这些节点随意地构成二叉树,请编程输出该二叉树的中序遍历序列。

输入

第一行是n(n小于100),表示有n个节点,每个节点按从1到n依次编号。第一行后有n行,每行三个正整数i、l、r,分别表示节点i及对应的左右孩子的编号,如果不存在孩子则以-1表示。三个整数之间用一个空格隔开。

输出

输出该二叉数的中序遍历序列。

样例输入 Copy

4
1 2 4
3 1 -1
4 -1 -1
2 -1 -1
样例输出 Copy

2 1 4 3

#include<iostream>
using namespace std;
struct node {
	int left, right, root;
	int val;
	node() { left = right = root = val = -1; }
};
int findroot(node* q, int n) {
	for (int i = 0; i < n; i++) {
		if (q[i].left != -1)
		for (int j = 0; j < n; j++) {
			if (q[j].val == q[i].left) {
				q[j].root = i; q[i].left = j+100;
			}
		}
		if(q[i].right!=-1)
			for (int j = 0; j < n; j++) {
				if (q[j].val == q[i].right) {
					q[j].root = i; q[i].right = j+100;
				}
		}
	}
	for (int i = 0; i < n; i++)
		if (q[i].root == -1)
			return i;
}
void zx(int q,node *x) 
{
	if (x[q].left != -1) {
		zx(x[q].left-100, x);
	}
	cout << x[q].val << ' ';
	if (x[q].right != -1) {
		zx(x[q].right-100, x);
	}
}
int main() {
	int n; cin >> n;
	node* x = new node[n];
	for (int i = 0; i < n; i++) {
	cin >> x[i].val >> x[i].left >> x[i].right;
	}
	zx(findroot(x, n), x);
}

问题 F 任意二叉树的后序遍历

题目描述

有若干个节点,每个节点上都有编号,把这些节点随意地构成二叉树,请编程输出该二叉树的后序遍历序列。

输入

第一行是n(n小于100),表示有n个节点,每个节点按从1到n依次编号。第一行后有n行,每行三个正整数i、l、r,分别表示节点i及对应的左右孩子的编号,如果不存在孩子则以-1表示。三个整数之间用一个空格隔开。

输出

输出该二叉数的后序遍历序列。

样例输入 Copy

4
1 2 4
4 -1 -1
2 -1 -1
3 1 -1
样例输出 Copy

2 4 1 3

#include<iostream>
using namespace std;
struct node {
	int left, right, root;
	int val;
	node() { left = right = root = val = -1; }
};
int findroot(node* q, int n) {
	for (int i = 0; i < n; i++) {
		if (q[i].left != -1)
			for (int j = 0; j < n; j++) {
				if (q[j].val == q[i].left) {
					q[j].root = i; q[i].left = j + 100;
				}
			}
		if (q[i].right != -1)
			for (int j = 0; j < n; j++) {
				if (q[j].val == q[i].right) {
					q[j].root = i; q[i].right = j + 100;
				}
			}
	}
	for (int i = 0; i < n; i++)
		if (q[i].root == -1)
			return i;
}
void hx(int q, node* x) {
	if (x[q].left != -1) {
		hx(x[q].left - 100, x);
	}
	if (x[q].right != -1) {
		hx(x[q].right - 100, x);
	}
	cout << x[q].val << ' ';
}
int main() {
	int n; cin >> n;
	node* x = new node[n];
	for (int i = 0; i < n; i++) {
		cin >> x[i].val >> x[i].left >> x[i].right;
	}
	hx(findroot(x, n), x);
}

问题 G: FBI树

题目述

我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为 B 串,全“1”串称为 I 串,既含“0”又含“1”的串则称为 F 串。
FBI 树是一棵二叉树,它的结点类型也包括 F 结点,B 结点和 I 结点三种。由一个长度为 2N 的“01”串 S 可以构造出一棵 FBI 树 T,递归的构造方法如下:
(1) T 的根结点为 R,其类型与串 S 的类型相同;
(2) 若串 S 的长度大于 1,可将串 S 从中间分开,分为等长的左右子串 S1 和 S2;由左子串 S1 构造 R 的左子树 T1,由右子串 S2 构造 R 的右子树 T2。

现在给定一个长度为 2N 的“01”串,请用上述构造方法构造出一棵 FBI 树,并输出它的后序遍历序列。

输入

第一行是一个整数 N(0≤N≤10),第二行是一个长度为 2N 的“01”串。

输出

包括一行,这一行只包含一个字符串,即 FBI 树的后序遍历序列。

样例输入

3
10001011
样例输出

IBFBBBFIBFIIIFF

#可以不管n

#include<iostream>
#include<queue>
using namespace std;
char x[1000]; int k = 0;
queue<string>s;
void tree(string a) {
	s.push(a); string b;
	while (!s.empty()) {
		b = s.front();
		s.pop();
		if (b == string(b.length(), '0')) x[k] = 'B';
		else if (b== string(b.length(), '1')) x[k] = 'I';
		else x[k] = 'F';
		k++;
		if (b.length() != 1) {
			s.push(b.substr(0, b.length() / 2));
			s.push(b.substr(b.length() / 2));
		}
	}
}
void hx(char* q, int n, int max) {

	if (2 * n + 1 <= max) {
		hx(q, 2 * n + 1, max);
	}
	if (2 * n + 2 <= max) {
		hx(q, 2 * n + 2, max);
	}
	cout << q[n];
}
int main() {
	int n; cin >> n;
	string a;
	cin >> a;
	tree(a);
	hx(x, 0, k);
}

问题 H: 满二叉树的深度

问题 H: 满二叉树的深度
题目描述

给你一个满二叉树的层次遍历序列,请编程输出该二叉树的深度。

输入

第一行是n(n小于26),表示有n个节点。第二行是该满二叉树的节点对应字母的层次遍历序列。

输出

输出该满二叉数的深度。

样例输入

3
B A C
样例输出

2

#include<iostream>
using namespace std;
int main() {
	int n; cin >> n;
	char* x = new char[n];
	for (int i = 0; i < n; i++)cin >> x[i];
	int k = 0,time=0;
	while (k <= n - 1) {
		k = 2 * k + 1;
		time++;
	}
	cout << time;
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值