给定一个二叉树,任务是找到从根节点到叶节点的任何路径的按位与的最大值。
例子:
Input: Below is the given graph:
Output: 7
Explanation:
path 1: 15->3->5 = (15 & 3 & 5) = 1
path 2: 15->3->1 =(15 & 3 & 1) = 1
path 3: 15->7->31=(15 & 7 & 31)= 7 (maximum)
path 4: 15->7->9 = (15 & 7 & 9) =1, out of these 7 is the maximum.
Input: Below is the given graph:
Output: 6
Explanation:
Path 1: 31->3->7 = (31 & 3 & 7) = 3
Path 2: 31->3->1 = (31 & 3 & 1) = 1
Path 3: 31->15->5 = (31 & 15 & 5) 5
Path 4: 31->15->22 = (31 & 15 & 22) = 6, out of these 6 is the maximum.
方法:想法是遍历从根节点到叶节点的所有路径,并计算该路径中发生的所有节点的按位与。保留一个全局变量以更新所有路径中的最大按位与值。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Initialise to update the maximum
// AND value from all the path
int maxm = 0;
// Node structure
struct Node {
int val;
// Left & right child of the node
Node *left, *right;
// Intialize consutructor
Node(int x)
{
val = x;
left = NULL;
right = NULL;
}
};
// Function to find the maximum value
// of Bitwise AND from root to leaf
// in a Binary tree
void maxm_Anding(Node* root, int ans)
{
// Check if root is not null
if (!root)
return;
if (root->left == NULL
and root->right == NULL) {
ans &= root->val;
// Find the maxmimum AND value and
// store in global maxm varibale
maxm = max(ans, maxm);
return;
}
// Traverse left of binary tree
maxm_Anding(root->left,
ans & root->val);
// Traverse right of the binary tree
maxm_Anding(root->right,
ans & root->val);
}
// Driver Code
int main()
{
// Given Tree
Node* root = new Node(15);
root->left = new Node(3);
root->right = new Node(7);
root->left->left = new Node(5);
root->left->right = new Node(1);
root->right->left = new Node(31);
root->right->right = new Node(9);
// Function Call
maxm_Anding(root, root->val);
// Print the maximum AND value
cout << maxm << endl;
return 0;
}
Java
// Java program for the above approach
class GFG{
// Initialise to update the maximum
// AND value from all the path
static int maxm = 0;
// Node structure
static class Node
{
int val;
// Left & right child of the node
Node left, right;
// Intialize consutructor
Node(int x)
{
val = x;
left = null;
right = null;
}
};
// Function to find the maximum value
// of Bitwise AND from root to leaf
// in a Binary tree
static void maxm_Anding(Node root, int ans)
{
// Check if root is not null
if (root == null)
return;
if (root.left == null && root.right == null)
{
ans &= root.val;
// Find the maxmimum AND value and
// store in global maxm varibale
maxm = Math.max(ans, maxm);
return;
}
// Traverse left of binary tree
maxm_Anding(root.left,
ans & root.val);
// Traverse right of the binary tree
maxm_Anding(root.right,
ans & root.val);
}
// Driver Code
public static void main(String[] args)
{
// Given Tree
Node root = new Node(15);
root.left = new Node(3);
root.right = new Node(7);
root.left.left = new Node(5);
root.left.right = new Node(1);
root.right.left = new Node(31);
root.right.right = new Node(9);
// Function Call
maxm_Anding(root, root.val);
// Print the maximum AND value
System.out.print(maxm + "\n");
}
}
// This code is contributed by sapnasingh4991
Python3
# Python3 program for the above approach
# Initialise to update the maximum
# AND value from all the path
maxm = 0
# Node structure
class Node:
def __init__(self, x):
self.val = x
# Left & right child of the node
self.left = None
self.right = None
# Function to find the maximum value
# of Bitwise AND from root to leaf
# in a Binary tree
def maxm_Anding(root: Node, ans: int) -> None:
global maxm
# Check if root is not null
if not root:
return
if (root.left is None and
root.right is None):
ans &= root.val
# Find the maxmimum AND value and
# store in global maxm varibale
maxm = max(ans, maxm)
return
# Traverse left of binary tree
maxm_Anding(root.left, ans & root.val)
# Traverse right of the binary tree
maxm_Anding(root.right, ans & root.val)
# Driver Code
if __name__ == "__main__":
# Given Tree
root = Node(15)
root.left = Node(3)
root.right = Node(7)
root.left.left = Node(5)
root.left.right = Node(1)
root.right.left = Node(31)
root.right.right = Node(9)
# Function Call
maxm_Anding(root, root.val)
# Print the maximum AND value
print(maxm)
# This code is contributed by sanjeev2552
C#
// C# program for the above approach
using System;
class GFG{
// Initialise to update the maximum
// AND value from all the path
static int maxm = 0;
// Node structure
class Node
{
public int val;
// Left & right child of the node
public Node left, right;
// Intialize consutructor
public Node(int x)
{
val = x;
left = null;
right = null;
}
};
// Function to find the maximum value
// of Bitwise AND from root to leaf
// in a Binary tree
static void maxm_Anding(Node root, int ans)
{
// Check if root is not null
if (root == null)
return;
if (root.left == null && root.right == null)
{
ans &= root.val;
// Find the maxmimum AND value and
// store in global maxm varibale
maxm = Math.Max(ans, maxm);
return;
}
// Traverse left of binary tree
maxm_Anding(root.left,
ans & root.val);
// Traverse right of the binary tree
maxm_Anding(root.right,
ans & root.val);
}
// Driver Code
public static void Main(String[] args)
{
// Given Tree
Node root = new Node(15);
root.left = new Node(3);
root.right = new Node(7);
root.left.left = new Node(5);
root.left.right = new Node(1);
root.right.left = new Node(31);
root.right.right = new Node(9);
// Function Call
maxm_Anding(root, root.val);
// Print the maximum AND value
Console.Write(maxm + "\n");
}
}
// This code is contributed by sapnasingh4991
输出:
7
时间复杂度: O(N 2 )
辅助空间: O(1)