20% 没有OC,当时没时间了, 中间有一个小地方错了(已发现)
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @param k int整型
* @return TreeNode类
*/
queue<TreeNode*> q;
int max_(TreeNode* root){
if (root == nullptr){
return 0;
}
int l = max_(root->left);
int r = max_(root->right);
return max(l, r) + 1;
}
TreeNode* cyclicShiftTree(TreeNode* root, int k) {
// write code here
if (!k || !root->left && !root->right){
return root;
}
int dep = max_(root);
int width = pow(2, dep - 1);
vector<vector<TreeNode*>> v(dep, vector<TreeNode*>(width, nullptr));
if (!root){
return nullptr;
}
q.push(root);
map<TreeNode*, int> m;
m[root] = 0;
int cur = 0;
while (q.size()){
int sz = q.size();
//int num = 0;
while (sz--){
auto t = q.front();
int num = m[t];
v[cur][num] = t;
q.pop();
if (t->left){
q.push(t->left);
m[t->left] = 2 * num;
}
if (t->right){
q.push(t->right);
m[t->right] = 2 * num + 1;
}
}
cur++;
}
for (int i = dep - 1; i >= 1; i--){
int t = pow(2, i);
int tmp = k;
tmp %= t; // 向右移动 tmp的位置
reverse(v[i].begin(), v[i].end()); //这里错了 !!!!! 不应该是v[i].end() 每一层的节点数不一样
reverse(v[i].begin(), v[i].begin() + tmp); //同理
reverse(v[i].begin() + tmp, v[i].end());
for (int j = 0; j < t; j++){
if (v[i][j]){
if (v[i - 1][j / 2]){ // 删除父节点原本的指针指向
v[i - 1][j / 2]->left = nullptr;
v[i - 1][j / 2]->right = nullptr;
}
}
}
for (int j = 0; j < t; j++){
if (v[i][j]){
if (j % 2 == 0){
if (v[i - 1][j / 2]){
v[i - 1][j / 2]->left = v[i][j];
}
}
else{
if (v[i - 1][j / 2]){
v[i - 1][j / 2]->right = v[i][j];
}
}
}
}
}
return root;
}
};
int main(){
Solution S;
TreeNode* root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
root->right->left = new TreeNode(4);
root->right->right = new TreeNode(5);
TreeNode* q = S.cyclicShiftTree(root, 1);
}