Problem 2331 Evaluate Boolean Binary Tree
Table of Contents
Problem Statement
Link - Problem 2331
Question
You are given the root
of a full binary tree with the following properties:
- Leaf nodes have either the value
0
or1
, where0
representsFalse
and1
representsTrue
. - Non-leaf nodes have either the value
2
or3
, where2
represents the booleanOR
and3
represents the booleanAND
.
The evaluation
of a node is as follows:
- If the node is a leaf node, the evaluation is the value of the node, i.e. True or False.
- Otherwise, evaluate the node’s two children and apply the boolean operation of its value with the children’s evaluations.
Return the boolean result of evaluating the
root
node.
A full binary tree is a binary tree where each node has either 0
or 2
children.
A leaf node is a node that has zero children.
Example 1
Input
graph TD
A((2))-->B((1))
A-->C((3))
C((3))-->D((0))
C((3))-->E((1))
F((OR))-->G((True))
F-->H((AND))
H-->I((False))
H-->J((True))
Input: root = [2,1,3,null,null,0,1]
Output: true
Explanation: The above diagram illustrates the evaluation process.
The AND node evaluates to False AND True = False.
The OR node evaluates to True OR False = True.
The root node evaluates to True, so we return true.
Example 2
Input: root = [0]
Output: false
Explanation: The root node is a leaf node and it evaluates to false, so we return false.
Constraints
- The number of nodes in the tree is in the range
[1, 1000]
. 0 <= Node.val <= 3
- Every node has either
0
or2
children. - Leaf nodes have a value of
0
or1
. - Non-leaf nodes have a value of
2
or3
.
Solution
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool evaluateTree(TreeNode* root) {
if(root->left == nullptr && root->right == nullptr)
return root->val;
else
{
if(root->val == 2)
return evaluateTree(root->left) || evaluateTree(root->right);
else
return evaluateTree(root->left) && evaluateTree(root->right);
}
}
};
Complexity Analysis
Time
: O(N)Space
: O(N)
Explanation
1. Intuition
- To evalute any node we need to evaluate its left and right child.
- There is no need to evaluate the leaf nodes as they are the base case.
- Using this we can develop a DFS based solution.
2. Implementation
- The
evaluateTree
function is used to evaluate the tree. - If the node is a leaf node, we return the value of the node.
- Otherwise, we evaluate the left and right child and apply the operation based on the value of the node.
- If the value of the node is 2, we apply OR operation.
- If the value of the node is 3, we apply AND operation.