链接:二叉树的操作
题目:
-
总Time Limit:
- 1000ms Memory Limit:
- 65535kB
-
Description
-
给定一棵二叉树,在二叉树上执行两个操作:
1. 节点交换
把二叉树的两个节点交换。
2. 前驱询问
询问二叉树的一个节点对应的子树最左边的节点。
Input
-
第一行输出一个整数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
Output
- 对于每次询问操作,输出相应的结果。 Sample Input
-
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
Sample Output
-
1 3 4 2
===============================================我是分割线==========================================
分析:数组存储二叉树节点,交换的时候直接修改父节点对应的字节点即可。#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 105;
int t,n,m,l[maxn],r[maxn],p[maxn];
//给出a,b然后直接可以交换,说明树中没有值相同的节点
void swit(int a,int b)
{
int pa = p[a],pb = p[b];
if(pa == pb){
if(l[pa] == a) l[pa] = b,r[pa] = a;
else r[pa] = b,l[pa] = a;
}else{
if(l[pa] == a) l[pa] = b; else r[pa] = b;p[b] = pa;//如果pa==pb,第一个if会影响第二个的操作
if(l[pb] == b) l[pb] = a; else r[pb] = a;p[a] = pb;
}
}
void sear(int a)
{
while(l[a] != -1) a = l[a];
cout << a << endl;
}
int main()
{
cin >> t;
while(t--) {
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
memset(p,0,sizeof(p));
cin >> n >> m;
while(n--) {//输入和存储没有问题
int a,la,ra;
cin >> a >> la >> ra;
l[a] = la,r[a] = ra;
p[la] = p[ra] = a;//-1的父节点是谁无所谓
}
while(m--) {
int type,a,b;
cin >> type;
if(type == 1) {cin >> a >> b;swit(a,b);}
else {cin >> a;sear(a);}
}
}
}