题目:
给出一个满足下述规则的二叉树:
root.val == 0
- 如果
treeNode.val == x
且treeNode.left != null
,那么treeNode.left.val == 2 * x + 1
- 如果
treeNode.val == x
且treeNode.right != null
,那么treeNode.right.val == 2 * x + 2
现在这个二叉树受到「污染」,所有的 treeNode.val
都变成了 -1
。
请你先还原二叉树,然后实现 FindElements
类:
FindElements(TreeNode* root)
用受污染的二叉树初始化对象,你需要先把它还原。bool find(int target)
判断目标值target
是否存在于还原后的二叉树中并返回结果。
想法一:
先还原二叉树,然后遍历二叉树查找target是否存在于树中,代码如下:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class FindElements(object):
def __init__(self, root):
"""
:type root: TreeNode
"""
self.restore(root, 0)
self.root = root # 定义二叉树
def restore(self, node, value): # 还原被污染的二叉树
if node == None:
return
else:
node.val = value
self.restore(node.left, 2 * value + 1)
self.restore(node.right, 2 * value + 2)
def find(self, target):
"""
:type target: int
:rtype: bool
"""
return self._find(self.root, target)
def _find(self, node, target):
if target < 0 or target > 10 ** 6 or node == None:
return False
else:
if node.val == target:
return True
return self._find(node.left, target) or self._find(node.right, target)
运行后通过了测试用例,但是提交后显示超时,所以不能用遍历解决:
想法二:
仍然是先还原二叉树,但用哈希表(即python中的集合)存储出现过的值,然后查找哈希表即可。因为每个值最多出现一次,所以可以用哈希表。代码如下:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class FindElements(object):
def __init__(self, root):
"""
:type root: TreeNode
"""
self.vals = set() # 初始化空集合用于存储节点值
self.restore(root, 0)
self.root = root # 定义二叉树
def restore(self, node, value): # 还原被污染的二叉树
if node == None:
return
else:
node.val = value
self.vals.add(value) # 将节点值添加到集合中
self.restore(node.left, 2 * value + 1)
self.restore(node.right, 2 * value + 2)
def find(self, target):
"""
:type target: int
:rtype: bool
"""
return target in self.vals # 在集合中查找目标值
提交通过,不过运行内存占用很大,下次有机会再优化吧。