您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 如何进行单值二叉树
## 1. 什么是单值二叉树
单值二叉树(Univalued Binary Tree)是指二叉树中所有节点的值都相同的特殊二叉树。这类二叉树具有以下特点:
- 所有左子树和右子树都是单值二叉树
- 根节点与所有子节点的值相同
- 空树也被视为单值二叉树
```mermaid
graph TD
A[1] --> B[1]
A --> C[1]
B --> D[1]
B --> E[1]
C --> F[1]
C --> G[1]
最直观的解法是使用递归遍历整棵树:
def is_unival_tree(root):
if not root:
return True
if root.left and root.left.val != root.val:
return False
if root.right and root.right.val != root.val:
return False
return is_unival_tree(root.left) and is_unival_tree(root.right)
时间复杂度:O(n),需要访问所有节点
空间复杂度:O(h),递归栈深度取决于树的高度
使用队列实现的迭代方案:
from collections import deque
def is_unival_tree(root):
if not root:
return True
queue = deque([root])
target = root.val
while queue:
node = queue.popleft()
if node.val != target:
return False
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return True
优点:避免递归栈溢出风险
当发现任何节点不满足条件时立即返回:
def is_unival_tree(root):
def helper(node, value):
if not node:
return True
if node.val != value:
return False
return helper(node.left, value) and helper(node.right, value)
return helper(root, root.val if root else None)
对于多核系统可以考虑并行检查左右子树(伪代码):
parallel_check(left) AND parallel_check(right)
def count_unival_subtrees(root):
count = 0
def helper(node):
nonlocal count
if not node:
return True
left = helper(node.left)
right = helper(node.right)
if left and right:
if (not node.left or node.left.val == node.val) and \
(not node.right or node.right.val == node.val):
count += 1
return True
return False
helper(root)
return count
def is_almost_unival(root, threshold=0.1):
if not root:
return True
target = root.val
mismatch = 0
total = 0
stack = [root]
while stack:
node = stack.pop()
if node.val != target:
mismatch += 1
total += 1
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return (mismatch / total) <= threshold
测试场景 | 示例树结构 | 预期结果 |
---|---|---|
空树 | null | True |
单节点 | [1] | True |
全等树 | [1,1,1] | True |
不等树 | [1,2,1] | False |
深层不等 | [1,1,1,null,2] | False |
方法 | 时间复杂度 | 空间复杂度 | 适用场景 |
---|---|---|---|
递归DFS | O(n) | O(h) | 树深度较小 |
迭代BFS | O(n) | O(w) | 需要避免递归 |
并行检查 | O(n/p) | O(h) | 大型平衡树 |
判断单值二叉树是二叉树基础操作的重要练习,通过这个问题可以深入理解: - 树的遍历方式(DFS/BFS) - 递归与迭代的转换 - 算法优化技巧 - 边界条件处理
建议读者在理解基础解法后,尝试解决统计单值子树数量的变种问题,以巩固学习效果。 “`
文章共计约950字,包含算法实现、优化思路、应用场景和扩展问题等内容,采用Markdown格式并包含Mermaid图表。可根据需要调整代码示例的语言(如改为Java/C++等)。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。