# author: Eldan
# task: leetcode.com/problems/all-nodes-distance-k-in-binary-tree/
from collections import deque
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
class Solution:
def _directed_parent_connection(self, node, parent=None):
if node:
node.parent = parent
self._directed_parent_connection(node.left, node)
self._directed_parent_connection(node.right, node)
def k_distance_nodes(self, root, target, k) -> []:
if not root:
return []
self._directed_parent_connection(root)
queue = deque([(target, 0)])
visited_nodes = {target}
while queue:
if queue[0][1] == k:
return [node.val for node, distance in queue]
node, distance = queue.popleft()
for neighbor in (node.left, node.right, node.parent):
if neighbor and neighbor not in visited_nodes:
queue.append((neighbor, distance + 1))
visited_nodes.add(neighbor)
return []
if __name__ == '__main__':
tree = TreeNode(3)
tree.left = TreeNode(5)
tree.right = TreeNode(1)
tree.left.left = TreeNode(6)
tree.left.right = TreeNode(2)
tree.right.left = TreeNode(0)
tree.right.right = TreeNode(8)
tree.left.right.left = TreeNode(7)
tree.left.right.right = TreeNode(4)
"""
3
/ \
[5] 1
/ \ / \
6 2 0 8
/ \
7 4
"""
target = tree.left
k = 2
solution = Solution()
result = solution.k_distance_nodes(tree, target, k)
if not result:
print('There is no k distinated nodes in the tree')
else:
print(result)
IyBhdXRob3I6IEVsZGFuCiMgdGFzazogbGVldGNvZGUuY29tL3Byb2JsZW1zL2FsbC1ub2Rlcy1kaXN0YW5jZS1rLWluLWJpbmFyeS10cmVlLwpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQoKCmNsYXNzIFRyZWVOb2RlOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbCk6CiAgICAgICAgc2VsZi52YWwgPSB2YWwKICAgICAgICBzZWxmLmxlZnQgPSBOb25lCiAgICAgICAgc2VsZi5yaWdodCA9IE5vbmUKCgpjbGFzcyBTb2x1dGlvbjoKICAgIGRlZiBfZGlyZWN0ZWRfcGFyZW50X2Nvbm5lY3Rpb24oc2VsZiwgbm9kZSwgcGFyZW50PU5vbmUpOgogICAgICAgIGlmIG5vZGU6CiAgICAgICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50CiAgICAgICAgICAgIHNlbGYuX2RpcmVjdGVkX3BhcmVudF9jb25uZWN0aW9uKG5vZGUubGVmdCwgbm9kZSkKICAgICAgICAgICAgc2VsZi5fZGlyZWN0ZWRfcGFyZW50X2Nvbm5lY3Rpb24obm9kZS5yaWdodCwgbm9kZSkKCiAgICBkZWYga19kaXN0YW5jZV9ub2RlcyhzZWxmLCByb290LCB0YXJnZXQsIGspIC0+IFtdOgogICAgICAgIGlmIG5vdCByb290OgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgc2VsZi5fZGlyZWN0ZWRfcGFyZW50X2Nvbm5lY3Rpb24ocm9vdCkKICAgICAgICAKICAgICAgICBxdWV1ZSA9IGRlcXVlKFsodGFyZ2V0LCAwKV0pCiAgICAgICAgdmlzaXRlZF9ub2RlcyA9IHt0YXJnZXR9CiAgICAgICAgCiAgICAgICAgd2hpbGUgcXVldWU6CiAgICAgICAgICAgIGlmIHF1ZXVlWzBdWzFdID09IGs6CiAgICAgICAgICAgICAgICByZXR1cm4gW25vZGUudmFsIGZvciBub2RlLCBkaXN0YW5jZSBpbiBxdWV1ZV0KCiAgICAgICAgICAgIG5vZGUsIGRpc3RhbmNlID0gcXVldWUucG9wbGVmdCgpCiAgICAgICAgICAgIGZvciBuZWlnaGJvciBpbiAobm9kZS5sZWZ0LCBub2RlLnJpZ2h0LCBub2RlLnBhcmVudCk6CiAgICAgICAgICAgICAgICBpZiBuZWlnaGJvciBhbmQgbmVpZ2hib3Igbm90IGluIHZpc2l0ZWRfbm9kZXM6CiAgICAgICAgICAgICAgICAgICAgcXVldWUuYXBwZW5kKChuZWlnaGJvciwgZGlzdGFuY2UgKyAxKSkKICAgICAgICAgICAgICAgICAgICB2aXNpdGVkX25vZGVzLmFkZChuZWlnaGJvcikKCiAgICAgICAgcmV0dXJuIFtdCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHRyZWUgPSBUcmVlTm9kZSgzKQogICAgdHJlZS5sZWZ0ID0gVHJlZU5vZGUoNSkKICAgIHRyZWUucmlnaHQgPSBUcmVlTm9kZSgxKQoKICAgIHRyZWUubGVmdC5sZWZ0ID0gVHJlZU5vZGUoNikKICAgIHRyZWUubGVmdC5yaWdodCA9IFRyZWVOb2RlKDIpCiAgICB0cmVlLnJpZ2h0LmxlZnQgPSBUcmVlTm9kZSgwKQogICAgdHJlZS5yaWdodC5yaWdodCA9IFRyZWVOb2RlKDgpCgogICAgdHJlZS5sZWZ0LnJpZ2h0LmxlZnQgPSBUcmVlTm9kZSg3KQogICAgdHJlZS5sZWZ0LnJpZ2h0LnJpZ2h0ID0gVHJlZU5vZGUoNCkKCiAgICAiIiIKICAgICAgICAgICAgICAgIDMKICAgICAgICAgICAgICAvICAgXAogICAgICAgICAgIFs1XQkJMQogICAgICAgICAgLyAgXCAgICAvICBcCiAgICAgICAgNiAgICAgMiAgMAkgIDgKICAgICAgICAgICAgLyAgXAogICAgICAgICAgIDcgICAgNAkKICAgICIiIgogICAgdGFyZ2V0ID0gdHJlZS5sZWZ0CiAgICBrID0gMgoKICAgIHNvbHV0aW9uID0gU29sdXRpb24oKQogICAgcmVzdWx0ID0gc29sdXRpb24ua19kaXN0YW5jZV9ub2Rlcyh0cmVlLCB0YXJnZXQsIGspCgogICAgaWYgbm90IHJlc3VsdDoKICAgICAgICBwcmludCgnVGhlcmUgaXMgbm8gayBkaXN0aW5hdGVkIG5vZGVzIGluIHRoZSB0cmVlJykKICAgIGVsc2U6CiAgICAgICAgcHJpbnQocmVzdWx0KQo=