题目:
给你一棵 完整二叉树 的根,这棵树有以下特征:
- 叶子节点 要么值为
0要么值为1,其中0表示False,1表示True。 - 非叶子节点 要么值为
2要么值为3,其中2表示逻辑或OR,3表示逻辑与AND。
计算 一个节点的值方式如下:
- 如果节点是个叶子节点,那么节点的 值 为它本身,即
True或者False。 - 否则,计算 两个孩子的节点值,然后将该节点的运算符对两个孩子值进行 运算 。
返回根节点 **root 的布尔运算值。
完整二叉树 是每个节点有 0 个或者 2 个孩子的二叉树。
叶子节点 是没有孩子的节点。
思路:
还是很简单的, 我这水平竟然一次就提交成功了
看一下我画的图
我一开始想的就是后续遍历
不能前序遍历, 因为当前节点要根据子树的值来进行赋值
但是我在写代码时, 突然开窍, 直接把递归函数当作返回值传进去
然后尝试了一些, 就通过了
代码:
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;
}
};