算法挑战50: 计算布尔二叉树的值

0 阅读1分钟

题目:

给你一棵 完整二叉树 的根,这棵树有以下特征:

  • 叶子节点 要么值为 0 要么值为 1 ,其中 0 表示 False ,1 表示 True 。
  • 非叶子节点 要么值为 2 要么值为 3 ,其中 2 表示逻辑或 OR ,3 表示逻辑与 AND 。

计算 一个节点的值方式如下:

  • 如果节点是个叶子节点,那么节点的  为它本身,即 True 或者 False 。
  • 否则,计算 两个孩子的节点值,然后将该节点的运算符对两个孩子值进行 运算 。

返回根节点 **root 的布尔运算值。

完整二叉树 是每个节点有 0 个或者 2 个孩子的二叉树。

叶子节点 是没有孩子的节点。

思路:

还是很简单的, 我这水平竟然一次就提交成功了

看一下我画的图

image.png

我一开始想的就是后续遍历

不能前序遍历, 因为当前节点要根据子树的值来进行赋值

但是我在写代码时, 突然开窍, 直接把递归函数当作返回值传进去

然后尝试了一些, 就通过了

代码:

var evaluateTree = function (root) {
    //非叶子节点
    if (root.val === 2) {//or
        return evaluateTree(root.left) || evaluateTree(root.right);
    }
    if (root.val === 3) {//and
        return evaluateTree(root.left) && evaluateTree(root.right);
    }
    return root.val;
};

更直观的写法

var evaluateTree = function (root) {
// 1. 递归终止条件(后序遍历的底部)
// 如果是叶子节点(值为 0 或 1),直接返回,不再向下递归 
if (root.val === 0 || root.val === 1) { return root.val; } 
// 2. 递归处理左子树 (Left) 
let leftResult = evaluateTree(root.left); 
// 3. 递归处理右子树 (Right) 
let rightResult = evaluateTree(root.right); 
// 4. 处理根节点 (Root) - 利用左右子树返回的结果进行计算 
// 这就是后序遍历中的“访问根节点”步骤 
if (root.val === 2) { 
// OR 操作 return leftResult || rightResult; 
} 
if (root.val === 3) { 
// AND 操作 return leftResult && rightResult; 
} 
};