5.7阿里笔试第二题

构建二叉树,层序,移位
#include<iostream>
#include<vector>
#include<stack>
#include<algorithm>
using namespace std;

class MyNode
{
public:
	int val;
	MyNode* pre;
	MyNode* left;
	MyNode* right;
	int deep;

	MyNode(int v, MyNode* p, MyNode* l, MyNode* r, int d) :val(v), pre(p), left(l), right(r), deep(d)
	{
		//cout << val << "," << deep << ",";
		//if (pre == NULL)cout << "null" << ",";
		//else cout << pre->val << ",";
		//if (left == NULL)cout << "null" << ",";
		//else cout << left->val << ",";
		//if (right == NULL)cout << "null" << ",";
		//else cout << right->val << ",";
		//cout << endl;
	}
	static bool cmp(MyNode* a, MyNode* b) {
		if (a->deep < b->deep)return true;
		if (a->deep > b->deep)return false;
		return a->val < b->val;
	}
};

int main()
{
	int n, k;
	cin >> n >> k;

	vector<int> arr(n, 0);
	for (int i = 0; i<n; ++i)
	{
		cin >> arr[i];
	}
	if (n <= 2)
	{
		for (int i = 0; i + 1<n; ++i)
		{
			cout << arr[i] << " ";
		}
		cout << arr.back();
		return 0;
	}

	MyNode* root = new MyNode(arr[0], NULL,NULL, NULL,1);
	vector<MyNode*> tree;
	tree.push_back(root);
	for (int i = 1; i < n; ++i)
	{
		MyNode* cur = root;
		while (true)
		{
			if (arr[i] < cur->val)
			{
				if (cur->left == NULL)
				{
					MyNode* newn = new MyNode(arr[i], cur, NULL, NULL,cur->deep+1);
					tree.push_back(newn);
					cur->left = newn;
					break;
				}
				else
				{
					cur = cur->left;
				}
			}
			else if (arr[i] >= cur->val)
			{
				if (cur->right == NULL)
				{
					MyNode* newn = new MyNode(arr[i], cur, NULL, NULL, cur->deep + 1);
					tree.push_back(newn);
					cur->right = newn;
					break;
				}
				else
				{
					cur = cur->right;
				}
			}

		}

	}

	sort(tree.begin(), tree.end(), MyNode::cmp);
	vector<int> tmp;
	int pred = 1;
	for (int i = 0; i<n; ++i)
	{
		if (tree[i]->deep != pred)
		{
			for (int j = 0; j < tmp.size(); ++j)
			{
				cout << tmp[(j - k + tmp.size()) % tmp.size()] << " ";
			}
			tmp.clear();
			pred = tree[i]->deep;
		}
		tmp.push_back(tree[i]->val);
	}
	for (int j = 0; j < tmp.size(); ++j)
	{
		cout << tmp[(j - k + tmp.size()) % tmp.size()] << " ";
	}
	return 0;
}


#笔试题目##阿里巴巴#
全部评论
第二题题目有拍吗?可否发在评论区
点赞 回复 分享
发布于 2021-05-07 21:16

相关推荐

06-02 15:17
门头沟学院 Java
心爱的idea:怎么会呢 应该是打招呼有问题 问就说实习6个月全国可飞随时到岗
点赞 评论 收藏
分享
07-04 21:23
已编辑
东莞城市学院 后端
秋招和春招只收到几个中大厂的笔试,本人比较菜,感觉大厂的笔试太难,算法题不能全部做出来就没过了,但是CVTE和小天才的感觉不是很难,基本上都做出来了,笔试还是挂了。Boss上投了Java后端开发都没有回音,boss上有面试机会都是C#工控软件开发方向的,但是这个方向不太懂,资料又少,面试的表现有点差,现在还是想看看Java这边,面试的时候比较有把握点。想请教一下,这份简历还有什么问题,一直没什么机会,还有什么地方要修改的。
程序员小白条:学历太差,民办和公办,外包还得区分的,这个学历+这个简历,没的办法,除非你有人脉,太难了,这环境,何况你都毕业了,连一段实习都没,肯定没公司会挑选了,没竞争力,开发才招几个人,跟你竞争的可不是二本,三本的人哦,何况你在二本,三本里面也排名不高
投递小天才等公司7个岗位
点赞 评论 收藏
分享
评论
点赞
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务