import
java.util.LinkedList;
import
java.util.Queue;
import
java.util.TreeMap;
class
GFG {
public
static
class
TreeNode {
int
val;
TreeNode left, right;
TreeNode(
int
x) {
val = x;
left =
null
;
right =
null
;
}
};
static
void
replaceDiag(TreeNode root,
int
d,
TreeMap<Integer, Integer> diagMap) {
if
(root ==
null
)
return
;
root.val = diagMap.get(d);
replaceDiag(root.left, d +
1
, diagMap);
replaceDiag(root.right, d, diagMap);
}
static
void
getDiagSum(TreeNode root,
int
d,
TreeMap<Integer, Integer> diagMap) {
if
(root ==
null
)
return
;
if
(diagMap.get(d) !=
null
)
diagMap.put(d, diagMap.get(d) + root.val);
else
diagMap.put(d, root.val);
getDiagSum(root.left, d +
1
, diagMap);
getDiagSum(root.right, d, diagMap);
}
static
void
levelOrder(TreeNode root) {
Queue<TreeNode> q =
new
LinkedList<TreeNode>();
q.add(root);
while
(
true
) {
int
length = q.size();
if
(length <=
0
)
break
;
while
(length >
0
) {
TreeNode temp = q.peek();
q.remove();
System.out.print(temp.val +
" "
);
if
(temp.left !=
null
)
q.add(temp.left);
if
(temp.right !=
null
)
q.add(temp.right);
length -=
1
;
}
}
}
public
static
void
main(String args[]) {
TreeNode root =
new
TreeNode(
5
);
root.left =
new
TreeNode(
6
);
root.right =
new
TreeNode(
3
);
root.left.left =
new
TreeNode(
4
);
root.left.right =
new
TreeNode(
9
);
root.right.right =
new
TreeNode(
2
);
TreeMap<Integer, Integer> diagMap =
new
TreeMap<Integer, Integer> ();
getDiagSum(root,
0
, diagMap);
replaceDiag(root,
0
, diagMap);
levelOrder(root);
}
}