您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        # 如何进行单值二叉树
## 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。