算法刷题打卡第82天:计算布尔二叉树的值

计算布尔二叉树的值

难度:简单

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

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

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

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

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

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

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

示例 1:

请添加图片描述

输入:root = [2,1,3,null,null,0,1]
输出:true
解释:上图展示了计算过程。
AND 与运算节点的值为 False AND True = False 。
OR 运算节点的值为 True OR False = True 。
根节点的值为 True ,所以我们返回 true 。

示例 2:

输入:root = [0]
输出:false
解释:根节点是叶子节点,且值为 false,所以我们返回 false 。

递归

思路:

  • 若当前节点是叶子节点的时候,判断是否为1返回结果,相当于转换为 TrueFalse
  • 若当前节点不是叶子节点,则递归查询其左右子节点,并以当前节点的逻辑对左右节点做运算。

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n),递归过程中将整个树遍历一遍。
  • 空间复杂度: O ( n ) O(n) O(n),递归过程中需要将利用到栈,由于是完整二叉树最小深度为 l o g n logn logn,即完全二叉树,最大深度为 n/2,即单向左或右衍生,因此复杂度为 O ( n ) O(n) O(n)
# 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.val == 0 or root.val == 1:
            return root.val == 1
        left, right = self.evaluateTree(root.left), self.evaluateTree(root.right)
        return left or right if root.val == 2 else left and right

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/evaluate-boolean-binary-tree

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我知道了。以下是用C++实现二叉树的基本操作的代码: ```c++ #include <iostream> using namespace std; struct TreeNode { char val; TreeNode* left; TreeNode* right; TreeNode(char x) : val(x), left(NULL), right(NULL) {} }; // 建立二叉树 void createTree(TreeNode* &root) { char val; cin >> val; if (val == '#') { root = NULL; } else { root = new TreeNode(val); createTree(root->left); createTree(root->right); } } // 先序遍历 void preorderTraversal(TreeNode* root) { if (root == NULL) { return; } cout << root->val << ' '; preorderTraversal(root->left); preorderTraversal(root->right); } // 中序遍历 void inorderTraversal(TreeNode* root) { if (root == NULL) { return; } inorderTraversal(root->left); cout << root->val << ' '; inorderTraversal(root->right); } // 后序遍历 void postorderTraversal(TreeNode* root) { if (root == NULL) { return; } postorderTraversal(root->left); postorderTraversal(root->right); cout << root->val << ' '; } // 计算深度 int maxDepth(TreeNode* root) { if (root == NULL) { return 0; } int leftDepth = maxDepth(root->left); int rightDepth = maxDepth(root->right); return max(leftDepth, rightDepth) + 1; } // 计算节点数 int countNodes(TreeNode* root) { if (root == NULL) { return 0; } int leftNodes = countNodes(root->left); int rightNodes = countNodes(root->right); return leftNodes + rightNodes + 1; } // 计算叶子节点数 int countLeaves(TreeNode* root) { if (root == NULL) { return 0; } if (root->left == NULL && root->right == NULL) { return 1; } int leftLeaves = countLeaves(root->left); int rightLeaves = countLeaves(root->right); return leftLeaves + rightLeaves; } // 查找=x的节点的个数 int countValue(TreeNode* root, char x) { if (root == NULL) { return 0; } int count = 0; if (root->val == x) { count++; } count += countValue(root->left, x); count += countValue(root->right, x); return count; } // 以缩格文本形式输出所有节点 void printTree(TreeNode* root, int depth) { if (root == NULL) { return; } printTree(root->right, depth + 1); for (int i = 0; i < depth; i++) { cout << " "; } cout << root->val << endl; printTree(root->left, depth + 1); } int main() { TreeNode* root = NULL; char command; while (cin >> command) { if (command == 'C') { createTree(root); } else if (command == '1') { preorderTraversal(root); cout << endl; } else if (command == '2') { inorderTraversal(root); cout << endl; } else if (command == '3') { postorderTraversal(root); cout << endl; } else if (command == 'H') { cout << maxDepth(root) << endl; } else if (command == 'L') { cout << countLeaves(root) << endl; } else if (command == 'N') { cout << countNodes(root) << endl; } else if (command == 'F') { char x; cin >> x; cout << countValue(root, x) << endl; } else if (command == 'P') { printTree(root, 0); } } return 0; } ``` 你可以先输入C,然后按照先序遍历的顺序输入二叉树的节点,其中#表示空节点。然后,你可以输入相应的命令来进行二叉树的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏秃然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值