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
orFalse
. - 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: 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
.
这题描述的比较复杂,其实挺简单的,就是叶子永远是true or false,非叶子永远是and or or,最后求root表示的boolean值。
递归超级好写:
/**
* 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.val == 0) {
return false;
} else if (root.val == 1) {
return true;
} else if (root.val == 2) {
return evaluateTree(root.left) | evaluateTree(root.right);
} else {
return evaluateTree(root.left) & evaluateTree(root.right);
}
}
}
迭代就略微难写一点但是凭自己的努力写出来了我好感动!(虽然回去抄了postorder的迭代代码……)下面说一下思路:
因为这个是evaluate两个bool的值(其实感觉有一点点像calculator?),所以需要先拿到两个叶子的值,然后用operand evaluate他们,于是这就是典型的postorder traversal。(虽然后来我又跑偏了怀疑过莫非要跟level order相关要用bfs……)然后就会神奇地发现,遍历出来的顺序其实就是val val op的形式,一遇到一个op,就可以evaluate最后两个val的结果。于是我们还需要一个stack来存放所有的val,就是bool们。
所以写成代码就是跟postorder完全一样的迭代代码,额外加上了一个stack来存booleans。在处理current node时候如果是叶子就往booleans stack里push,否则就pop出booleans stack里最上面的两个node,用当前的node代表的operand来处理他们。最后,booleans stack里只会剩一个元素,就是最终的值了。
/**
* 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) {
Deque<TreeNode> stack = new ArrayDeque<>();
Set<TreeNode> seen = new HashSet<>();
stack.push(root);
seen.add(root);
Deque<Boolean> bools = new ArrayDeque<>();
while (!stack.isEmpty()) {
TreeNode node = stack.peek();
if (node.left != null && !seen.contains(node.left)) {
stack.push(node.left);
seen.add(node.left);
} else if (node.right != null && !seen.contains(node.right)) {
stack.push(node.right);
seen.add(node.right);
} else {
node = stack.pop();
if (node.val == 0) {
bools.push(false);
} else if (node.val == 1) {
bools.push(true);
} else {
boolean bool1 = bools.pop();
boolean bool2 = bools.pop();
if (node.val == 2) {
bools.push(bool1 | bool2);
} else {
bools.push(bool1 & bool2);
}
}
}
}
return bools.peek();
}
}