二叉树计算公式

  1. n个节点的二叉树一共有((2n)!)/(n! * (n+1)!)种
  2. n层二叉树的第n层最多为2^(n-1)个
  3. 二叉树节点计算公式 N = n0+n1+n2,度为0的叶子节点比度为2的节点数多一个。N=1n1+2n2+1
  4. 对任何一棵二叉树T,如果其终端节点数为n0,度为2的节点数为n2,则n0=n2+1
  5. 具有n个节点的完全二叉树的深度为log2(n) + 1
  6. B-树,除叶子与根节点以外的任意结点的分支数介于m/2,m
  7. 具有n 个结点的平衡二叉树的深度为[log2n]+1
  8. 树的高度:从根节点到所有叶节点中最大的边的数目。树的深度:从根节点到所有叶节点中最多的节点数目。
  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解题思路: 1. 将中缀表达式转换为后缀表达式,使用堆栈实现 2. 根据后缀表达式构造二叉树 3. 后序遍历二叉树计算每个子树的值,得到表达式的真值 步骤: 1. 定义一个堆栈,用于存储运算符和括号 2. 遍历中缀表达式,对于每个字符: - 如果是运算符或括号,将其压入堆栈 - 如果是变量,将其加入后缀表达式 3. 遍历堆栈,将剩余的运算符弹出并加入后缀表达式 4. 根据后缀表达式构造二叉树,使用堆栈实现 - 对于每个字符: - 如果是变量,创建一个只包含该变量的二叉树并压入堆栈 - 如果是运算符,弹出堆栈中的两棵子树,将它们作为该运算符的左右子树,创建一个新的二叉树并将其压入堆栈 5. 后序遍历二叉树计算每个子树的值,得到表达式的真值 Python代码实现: ```python class TreeNode: def __init__(self, val=None, left=None, right=None): self.val = val self.left = left self.right = right def infix_to_postfix(infix): operators = {'(': 0, ')': 0, 'NOT': 1, 'AND': 2, 'OR': 3} stack = [] postfix = [] for token in infix: if token in operators: if token == '(': stack.append(token) elif token == ')': while stack[-1] != '(': postfix.append(stack.pop()) stack.pop() else: while stack and operators[stack[-1]] >= operators[token]: postfix.append(stack.pop()) stack.append(token) else: postfix.append(token) while stack: postfix.append(stack.pop()) return postfix def postfix_to_tree(postfix): stack = [] for token in postfix: if token in {'NOT', 'AND', 'OR'}: right = stack.pop() if token == 'NOT': stack.append(TreeNode('NOT', None, right)) else: left = stack.pop() stack.append(TreeNode(token, left, right)) else: stack.append(TreeNode(token)) return stack.pop() def evaluate(root, values): if root.val in values: return values[root.val] elif root.val == 'NOT': return not evaluate(root.right, values) elif root.val == 'AND': return evaluate(root.left, values) and evaluate(root.right, values) elif root.val == 'OR': return evaluate(root.left, values) or evaluate(root.right, values) def print_tree(root, level=0): if root: print_tree(root.right, level + 1) print(' ' * 4 * level + '->', root.val) print_tree(root.left, level + 1) infix = input('请输入命题演算公式:').split() postfix = infix_to_postfix(infix) root = postfix_to_tree(postfix) print('后缀表达式:', postfix) print('二叉树构造过程:') print_tree(root) print('真值表:') variables = list(set(filter(lambda x: x not in {'NOT', 'AND', 'OR'}, infix))) for values in itertools.product([True, False], repeat=len(variables)): values = dict(zip(variables, values)) result = evaluate(root, values) print(values, '->', result) ``` 示例输入: ``` 请输入命题演算公式:A AND (B OR NOT C) ``` 示例输出: ``` 后缀表达式: ['A', 'B', 'C', 'NOT', 'OR', 'AND'] 二叉树构造过程: -> AND -> B -> OR -> A -> NOT -> C 真值表: {'A': True, 'B': True, 'C': True} -> True {'A': True, 'B': True, 'C': False} -> True {'A': True, 'B': False, 'C': True} -> True {'A': True, 'B': False, 'C': False} -> False {'A': False, 'B': True, 'C': True} -> False {'A': False, 'B': True, 'C': False} -> False {'A': False, 'B': False, 'C': True} -> False {'A': False, 'B': False, 'C': False} -> False ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值