using
System;
class
TrieNode {
public
TrieNode[] children;
public
TrieNode()
{
children =
new
TrieNode[2];
}
}
class
Trie {
public
TrieNode root;
public
Trie()
{
root =
new
TrieNode();
}
public
void
insert(
int
num)
{
TrieNode node = root;
for
(
int
i = 31; i >= 0; i--) {
int
bit = (num >> i) & 1;
if
(node.children[bit] ==
null
) {
node.children[bit] =
new
TrieNode();
}
node = node.children[bit];
}
}
public
int
findMaxXOR(
int
num)
{
TrieNode node = root;
int
max_xor = 0;
for
(
int
i = 31; i >= 0; i--) {
int
bit = (num >> i) & 1;
if
(node.children[bit ^ 1] !=
null
) {
max_xor = (max_xor << 1) | 1;
node = node.children[bit ^ 1];
}
else
{
max_xor = max_xor << 1;
node = node.children[bit];
}
}
return
max_xor;
}
}
class
TreeNode {
public
int
val;
public
TreeNode left;
public
TreeNode right;
public
TreeNode(
int
x)
{
val = x;
left =
null
;
right =
null
;
}
}
class
Solution {
public
Trie trie;
public
Solution()
{
trie =
new
Trie();
}
public
void
constructTrie(TreeNode node)
{
if
(node ==
null
) {
return
;
}
trie.insert(node.val);
constructTrie(node.left);
constructTrie(node.right);
}
public
int
findMaximumXOR(TreeNode root)
{
constructTrie(root);
int
max_xor = 0;
TreeNode node = root;
while
(node !=
null
) {
max_xor = Math.Max(max_xor,
trie.findMaxXOR(node.val));
node = (node.left !=
null
) ? node.left
: node.right;
}
return
max_xor;
}
static
void
Main(
string
[] args)
{
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.left =
new
TreeNode(6);
Solution s =
new
Solution();
int
result = s.findMaximumXOR(root);
Console.WriteLine(
"Maximum XOR: "
+ result);
}
}