using
System;
using
System.Collections;
using
System.Collections.Generic;
class
GFG {
public
class
Node {
public
int
key;
public
Node left, right;
};
static
Node makeNode(
int
data)
{
Node newNode =
new
Node();
newNode.key = data;
newNode.right = newNode.right =
null
;
return
newNode;
}
static
Node buildTree(
int
[] inorder,
int
[] levelOrder,
int
iStart,
int
iEnd,
int
n)
{
if
(n <= 0)
return
null
;
Node root = makeNode(levelOrder[0]);
int
index = -1;
for
(
int
i = iStart; i <= iEnd; i++) {
if
(levelOrder[0] == inorder[i]) {
index = i;
break
;
}
}
HashSet<
int
> s =
new
HashSet<
int
>();
for
(
int
i = iStart; i < index; i++)
s.Add(inorder[i]);
int
[] lLevel =
new
int
[s.Count];
int
[] rLevel
=
new
int
[iEnd - iStart - s.Count];
int
li = 0, ri = 0;
for
(
int
i = 1; i < n; i++) {
if
(s.Contains(levelOrder[i]))
lLevel[li++] = levelOrder[i];
else
rLevel[ri++] = levelOrder[i];
}
root.left = buildTree(inorder, lLevel, iStart,
index - 1, index - iStart);
root.right = buildTree(inorder, rLevel, index + 1,
iEnd, iEnd - index);
return
root;
}
static
void
printInorder(Node node)
{
if
(node ==
null
)
return
;
printInorder(node.left);
Console.Write(node.key +
" "
);
printInorder(node.right);
}
public
static
void
Main(
string
[] args)
{
int
[] inorder
=
new
int
[] { 4, 8, 10, 12, 14, 20, 22 };
int
[] level
=
new
int
[] { 20, 8, 22, 4, 12, 10, 14 };
int
n = inorder.Length;
Node root = buildTree(inorder, level, 0, n - 1, n);
Console.WriteLine(
"Inorder traversal of the constructed tree is "
);
printInorder(root);
}
}