# Leetcode Python超琐碎笔记: 965. Univalued Binary Tree

### 问题描述

A binary tree is univalued if every node in the tree has the same value.

Return `true` if and only if the given tree is univalued.

Example 1:

Input: [1,1,1,1,1,null,1]
Output: true

Example 2:

Input: [2,2,2,5,2]
Output: false

Note:

1. The number of nodes in the given tree will be in the range `[1, 100]`.
2. Each node's value will be an integer in the range `[0, 99]`.

### 实现方法（及调优过程）

##### 方法1：60 ms

isUnivalTree(root)的结果即是“root所代表的子树是否为全等”这个命题的真值。首先须确定root到底有没有左子树和右子树，如果没有，则真值为`True`；如果有，则root的值与左右两个子节点的值必须相等，且两个子节点所代表的子树也必须是全等的，两个条件同时满足时真值为`True`

``````# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
def isUnivalTree(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
left = (not root.left) or ((root.val == root.left.val) and self.isUnivalTree(root.left))
right = (not root.right) or ((root.val == root.right.val) and self.isUnivalTree(root.right))
return left and right
``````
• 时间复杂度：O(n) （`n`为树的节点数，最坏情况下每个节点都被遍历）
• 空间复杂度：O(m) （递归本身的栈会占用一些资源，`m`为树的深度，影响栈的数量）
##### 方法2：36 ms

``````# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
def isUnivalTree(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
values = []

def getValues(node):
if node:
values.append(node.val)
getValues(node.left)
getValues(node.right)

getValues(root)
return len(set(values)) == 1
``````
• 时间复杂度：O(n) （`n`为树的节点数，最坏情况下每个节点都被遍历）
• 空间复杂度：O(m) （递归本身的栈会占用一些资源，`m`为树的深度，影响栈的数量）
##### 方法3：70 ms

``````# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
def isUnivalTree(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
root_val = root.val

def hasUniValue(node):
if node:
return node.val == root_val and hasUniValue(node.left) and hasUniValue(node.right)
else:
return True

return hasUniValue(root)
``````

``````        def hasUniValue(node):
return not node or (node.val == root_val and hasUniValue(node.left) and hasUniValue(node.right))
``````
• 时间复杂度：O(n) （`n`为树的节点数，最坏情况下每个节点都被遍历）
• 空间复杂度：O(m) （递归本身的栈会占用一些资源，`m`为树的深度，影响栈的数量）