using
System;
using
System.Collections.Generic;
class
GFG {
class
Node {
public
int
val;
public
Node left, right;
public
Node(
int
val)
{
this
.val = val;
left = right =
null
;
}
}
static
Dictionary<Node,
int
> depth =
new
Dictionary<Node,
int
>();
static
int
findDepth(Node cur)
{
int
mx = 0;
if
(cur.left !=
null
) {
mx = findDepth(cur.left);
}
if
(cur.right !=
null
) {
mx = Math.Max(mx, findDepth(cur.right));
}
depth[cur] = mx + 1;
return
depth[cur];
}
static
int
dfs(Node cur,
int
flag,
int
parValue)
{
if
(parValue != -1) {
if
(flag == 1)
cur.val = parValue;
else
cur.val = parValue * 2;
}
int
l = 0, r = 0;
if
(cur.left !=
null
&& cur.right !=
null
) {
if
(depth.ContainsKey(cur.left) && depth.ContainsKey(cur.right) && depth[cur.left] > depth[cur.right]) {
l = dfs(cur.left, 1, cur.val);
r = dfs(cur.right, 0, cur.val);
}
else
{
l = dfs(cur.left, 0, cur.val);
r = dfs(cur.right, 1, cur.val);
}
}
else
if
(cur.left !=
null
) {
l = dfs(cur.left, 1, cur.val);
}
else
if
(cur.right !=
null
) {
r = dfs(cur.right, 1, cur.val);
}
return
(l + r + cur.val);
}
static
int
minimumSum(Node root)
{
findDepth(root);
return
dfs(root, 1, -1);
}
static
void
Main() {
int
X = 2;
Node root =
new
Node(X);
root.left =
new
Node(-1);
root.right =
new
Node(-1);
root.left.left =
new
Node(-1);
root.left.right =
new
Node(-1);
root.left.right.left =
new
Node(-1);
root.left.right.right =
new
Node(-1);
root.left.right.right.left =
new
Node(-1);
Console.Write(minimumSum(root));
}
}