分析:
注意题目中有一句话
智乃最近学习了树旋转,树旋转的本质是二叉树旋转轴节点与其父节点父子关系的改变,从视觉效果上看起来好像整个树进行了“旋转”。
通过分析样例,我们发现
图中,1,3发生了互换,由于我们只需要找出旋转次数和旋转轴,可以发现,如果图1中3作为右孩子左旋,可以得到图2,如果图2中1作为左孩子右旋,可以得到图1,由于要还原操作,旋转轴是1,因为图2中1不是根结点
由于不需要判断是左旋操作还是右旋操作,我们发现:只需要找到 开始结束时,父子结点互换的 情况就可以了
那么,枚举初始图,然后再去看看旋转图是否有孩子结点和他互换就行了,注意输出时,输出初始图的父结点/根结点
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 1e3 + 10;
struct node
{
int l;
int r;
}st[N],ed[N];
vector<int> q;
int main()
{
int n;
cin >> n;
for (int i = 1;i <= n;i++)
cin >> st[i].l >> st[i].r;
for (int i = 1;i <= n;i++)
cin >> ed[i].l >> ed[i].r;
int res = 0;
for (int i = 1;i <= n;i++)
{
if (st[i].l == 0 && st[i].r == 0)
continue;
for (int j = 1;j <= n;j++)
if (j == st[i].l || j == st[i].r)
{
if (ed[j].l == i || ed[j].r == i)
res++, q.push_back(i);
}
}
cout << res << endl;
for (auto t : q)
cout << t << ' ';
}