题意:
现有一棵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; } }
时间复杂度:空间复杂度: