1-E 二叉树的操作

描述

给定一棵二叉树,在二叉树上执行两个操作:

  1. 节点交换
    把二叉树的两个节点交换。

图1

  1. 前驱询问
    询问二叉树的一个节点对应的子树最左边的节点。

图2

输入

第一行输出一个整数t(t <= 100),代表测试数据的组数。
对于每组测试数据,第一行输入两个整数n m,n代表二叉树节点的个数,m代表操作的次数。
随后输入n行,每行包含3个整数X Y Z,对应二叉树一个节点的信息。X表示节点的标识,Y表示其左孩子的标识,Z表示其右孩子的标识。
再输入m行,每行对应一次操作。每次操作首先输入一个整数type。
当type=1,节点交换操作,后面跟着输入两个整数x y,表示将标识为x的节点与标识为y的节点交换。输入保证对应的节点不是祖先关系。
当type=2,前驱询问操作,后面跟着输入一个整数x,表示询问标识为x的节点对应子树最左的孩子。
1<=n<=100,节点的标识从0到n-1,根节点始终是0.
m<=100

输出

对于每次询问操作,输出相应的结果。

样例输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
5 5
0 1 2
1 -1 -1
2 3 4
3 -1 -1
4 -1 -1
2 0
1 1 2
2 0
1 3 4
2 2
3 2
0 1 2
1 -1 -1
2 -1 -1
1 1 2
2 0

样例输出

1
2
3
4
1
3
4
2

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <iostream>

using namespace std;


struct node {
int parent;
int left;
int right;
};

void swap(int a, int b, struct node tree[]){
// Parent
if(tree[a].parent == tree[b].parent){
if(tree[tree[a].parent].left == a){
tree[tree[a].parent].left = b;
tree[tree[a].parent].right = a;
}
else{
tree[tree[a].parent].right = b;
tree[tree[a].parent].left = a;
}
}
else{
if(tree[tree[a].parent].left == a){
tree[tree[a].parent].left = b;
}
else{
tree[tree[a].parent].right = b;
}
int temp = tree[a].parent;
tree[a].parent = tree[b].parent;
if(tree[tree[b].parent].left == b){
tree[tree[b].parent].left = a;
}
else {
tree[tree[b].parent].right = a;
}
tree[b].parent = temp;
}
}

int check(int p, struct node tree[]){
while(tree[p].left != -1){
p = tree[p].left;
}
return p;
}

void output(struct node tree[], int n){
for(int i = 0; i < n; i++){
cout << "Tree: " << i << " Left: " << tree[i].left << " Right: " << tree[i].right << " Parent: " << tree[i].parent << endl;
}
}

int main (void){
struct node tree[100];
int group;
cin >> group;
for(int g = 0; g < group; g++){
int n, m;
cin >> n >> m;
tree[0].parent = -1;
int tag, left, right;
for(int i = 0; i < n; i++){
cin >> tag >> left >> right;
tree[tag].left = left;
tree[tag].right = right;
tree[left].parent = tag;
tree[right].parent = tag;
}
int type;
for(int i = 0; i < m; i++){
cin >> type;
if(type == 1){
int a, b;
cin >> a >> b;
swap(a, b, tree);
}
else if(type == 2){
int p;
cin >> p;
cout << check(p, tree) << endl;
}
}
}
return 0;
}

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×