题意:
现有一棵n个节点构成的二叉树,请你将每一层的节点向右循环位移k位。
某层向右位移一位(即k=1)的含义为:
1.若当前节点为左孩子节点,会变成当前节点的双亲节点的右孩子节点。
2.若当前节点为右儿子,会变成当前节点的双亲节点的右边相邻兄弟节点的左孩子节点。(如果当前节点的双亲节点已经是最右边的节点了,则会变成双亲节点同级的最左边的节点的左孩子节点)
3.该层的每一个节点同时进行一次位移。
4.是从最下面的层开始位移,位移完每一层之后,再向上,直到根节点,位移完毕。
方法一:
bfs
思路:利用队列实现层次遍历来模拟右移操作。
题意要求从最下层开始右移,但其实与从最上层开始右移效果一样。
要一层一层的遍历,既要存储每一层的父节点,也要存储这一层父节点的所有儿子节点(儿子节点可以为 null );
然后,循环右移所有的儿子节点,得到新的儿子节点序列,最后与新的父亲节点拼接即可。
class Solution {
public:
TreeNode* cyclicShiftTree(TreeNode* root, int k) {
if(root==nullptr)
return root;
queue<TreeNode*> q;//单向队列
deque<TreeNode*> dq;//双向队列
vector<TreeNode*> v;//存储父节点
q.push(root);
int num;//每一层可移动位置的个数
while(!q.empty()){
dq.clear();
v.clear();
int cnt=q.size();
num=cnt*2;//每一层可移动位置的个数
while(cnt--){//一层一层的遍历
TreeNode *p=q.front();
q.pop();
v.push_back(p);//存储每一层的父节点
dq.push_back(p->left);//存储每一层的左儿子节点(包含null节点)
if(p->left)
q.push(p->left);
dq.push_back(p->right);//存储每一层的右儿子节点(包含null节点)
if(p->right)
q.push(p->right);
}
int step=k%num;//右移的步数取余
for(int i=0;i<step;i++){//右移操作
dq.push_front(dq.back());
dq.pop_back();
}
for(int i=0;i<v.size();i++){//拼接新的儿子节点
v[i]->left=dq.front();
dq.pop_front();
v[i]->right=dq.front();
dq.pop_front();
}
}
return root;
}
};
时间复杂度:
空间复杂度:![]()
方法二:
java模拟
思路:思路与方法一相同,直接模拟即可。
import java.util.*;
public class Solution {
public TreeNode cyclicShiftTree (TreeNode root, int k) {
if(root==null)
return root;
Queue<TreeNode> q=new LinkedList<>();//单向队列
Deque<TreeNode> dq=new LinkedList<>();//双向队列
Vector<TreeNode> v=new Vector<>();//存储父节点
q.add(root);
int num;//每一层可移动位置的个数
while(!q.isEmpty()){
// System.out.println(q.size());
dq.clear();
v.clear();
int cnt=q.size();
num=cnt*2;//每一层可移动位置的个数
while((cnt--)!=0){//一层一层的遍历
TreeNode p=q.poll();
v.add(p);//存储每一层的父节点
dq.addLast(p.left);//存储每一层的左儿子节点(包含null节点)
if(p.left!=null)
q.add(p.left);
dq.addLast(p.right);//存储每一层的右儿子节点(包含null节点)
if(p.right!=null)
q.add(p.right);
}
int step=k%num;//右移的步数取余
for(int i=0;i<step;i++){//右移操作
dq.addFirst(dq.pollLast());
}
for(int i=0;i<v.size();i++){//拼接新的儿子节点
v.get(i).left=dq.pollFirst();
v.get(i).right=dq.pollFirst();
}
}
return root;
}
}
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号