提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
问题 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;
}