LeetCode 2331. Evaluate Boolean Binary Tree

You are given the root of a full binary tree with the following properties:

  • Leaf nodes have either the value 0 or 1, where 0 represents False and 1 represents True.
  • Non-leaf nodes have either the value 2 or 3, where 2 represents the boolean OR and 3 represents the boolean AND.

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.

full binary tree is a binary tree where each node has either 0 or 2 children.

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 or 2 children.
  • Leaf nodes have a value of 0 or 1.
  • Non-leaf nodes have a value of 2 or 3.

这题描述的比较复杂,其实挺简单的,就是叶子永远是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();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值