using
System;
using
System.Collections.Generic;
public
class
TreeNode {
public
int
val;
public
TreeNode left;
public
TreeNode right;
public
TreeNode(
int
x)
{
val = x;
left = right =
null
;
}
}
class
GFG {
public
void
PrintTree(TreeNode root)
{
if
(root ==
null
)
return
;
PrintTree(root.left);
Console.Write(root.val +
" "
);
PrintTree(root.right);
}
public
void
dfsit(TreeNode rt,
int
key,
Dictionary<
int
, List<TreeNode> > mp)
{
if
(rt ==
null
)
return
;
if
(!mp.ContainsKey(key)) {
mp.Add(key,
new
List<TreeNode>());
}
mp[key].Add(rt);
dfsit(rt.right, key + 1, mp);
dfsit(rt.left, key + 1, mp);
rt.left =
null
;
rt.right =
null
;
}
public
TreeNode ShiftRight(TreeNode root)
{
Dictionary<
int
, List<TreeNode> > mp
=
new
Dictionary<
int
, List<TreeNode> >();
dfsit(root, 0, mp);
TreeNode cur =
new
TreeNode(-1);
Queue<TreeNode> st =
new
Queue<TreeNode>();
st.Enqueue(cur);
int
i = 0;
int
n = mp.Count;
while
(i < n) {
List<TreeNode> nd = mp[i];
int
j = 0;
Queue<TreeNode> tmp =
new
Queue<TreeNode>();
while
(j < nd.Count) {
TreeNode r = st.Dequeue();
r.right = nd[j];
tmp.Enqueue(nd[j]);
j++;
if
(j < nd.Count) {
r.left = nd[j];
tmp.Enqueue(nd[j]);
j++;
}
}
st = tmp;
i++;
}
return
cur.right;
}
public
static
void
Main()
{
TreeNode root =
new
TreeNode(1);
root.left =
new
TreeNode(2);
root.right =
new
TreeNode(3);
root.left.left =
new
TreeNode(4);
root.left.right =
new
TreeNode(5);
root.right.right =
new
TreeNode(6);
GFG solution =
new
GFG();
root = solution.ShiftRight(root);
solution.PrintTree(root);
}
}