You are given the root
of a full binary tree with the following properties:
0
or 1
, where 0
represents False
and 1
represents True
.2
or 3
, where 2
represents the boolean OR
and 3
represents the boolean AND
.The evaluation of a node is as follows:
True
or False
.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: 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:
[1, 1000]
.0 <= Node.val <= 3
0
or 2
children.0
or 1
.2
or 3
.Given the root of a full binary tree where leaf nodes have values 0 or 1 (representing False or True), and non-leaf nodes have values 2 or 3 (representing OR and AND operations respectively), evaluate the tree and return the boolean result at the root.
This problem is naturally solved using recursion. The recursive function evaluates a node based on its value:
True
(if value is 1) or False
(if value is 0).# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def evaluateTree(self, root: Optional[TreeNode]) -> bool:
if root.left is None: # Base case: leaf node
return bool(root.val)
left_result = self.evaluateTree(root.left)
right_result = self.evaluateTree(root.right)
if root.val == 2: # OR operation
return left_result or right_result
else: # AND operation
return left_result and right_result
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean evaluateTree(TreeNode root) {
if (root.left == null) { // Base case: leaf node
return root.val == 1;
}
boolean leftResult = evaluateTree(root.left);
boolean rightResult = evaluateTree(root.right);
if (root.val == 2) { // OR operation
return leftResult || rightResult;
} else { // AND operation
return leftResult && rightResult;
}
}
}
(Other language implementations (C++, Go, TypeScript, Rust, C) are similar in structure and logic, differing primarily in syntax.)
This recursive approach clearly reflects the problem's structure and is easy to understand and implement. The time and space complexities are acceptable for the given constraints.