牛客寒假训练营 3 G (树,枚举,性质)

原题链接

分析

注意题目中有一句话

智乃最近学习了树旋转,树旋转的本质是二叉树旋转轴节点与其父节点父子关系的改变,从视觉效果上看起来好像整个树进行了“旋转”。

通过分析样例,我们发现

牛客寒假训练营 3 G (树,枚举,性质)

图中,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 << ' ';
}

上一篇:数据结构与算法【基础版】:2.8 栈【先进后出】


下一篇:c++模板特化之用deque容器实现stack容器