题目描述:
LeetCode 742. Closest Leaf in a Binary Tree
Given a binary tree where every node has a unique value, and a target key k
, find the closest leaf node to target k
in the tree.
A node is called a leaf if it has no children.
In the following examples, the input tree is represented in flattened form row by row. The actual root
tree given will be a TreeNode object.
Example 1:
Input: root = [1, 3, 2], k = 1 Diagram of binary tree: 1 / \ 3 2 Output: 2 (or 3) Explanation: Either 2 or 3 is the closest leaf node to 1.
Example 2:
Input: root = [1], k = 1 Output: 1 Explanation: The closest leaf node is the root node itself.
Example 3:
Input: root = [1,2,3,4,null,null,null,5,null,6], k = 2 Diagram of binary tree: 1 / \ 2 3 / 4 / 5 / 6 Output: 3 Explanation: The leaf node with value 3 (and not the leaf node with value 6) is closest to the node with value 2.
Note:
root
represents a binary tree with at least1
node and at most1000
nodes.- Every node has a unique
node.val
in range[1, 1000]
. - There exists some node in the given binary tree for which
node.val == k
.
题目大意:
给定节点值均不重复的二叉树,求距离目标节点K最近的叶子节点的值
解题思路:
递归 + 非递归
递归遍历二叉树: 找到值为k的节点knode,所有叶子节点leaves,构造字典parents存储节点值到其父节点的映射 求k的所有祖先节点(由近及远),记为kParents 遍历leaves,记当前节点为leaf: 求leaf的所有祖先节点(由近及远),记为leafParents kParents和leafParents的公共部分即k到leaf的路径,更新答案
Python代码:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def findClosestLeaf(self, root, k):
"""
:type root: TreeNode
:type k: int
:rtype: int
"""
parents = {}
leaves = []
self.knode = None
def traverse(root):
if root.val == k: self.knode = root
if not root.left and not root.right:
leaves.append(root)
return
for child in (root.left, root.right):
if not child: continue
traverse(child)
parents[child.val] = root
def findParents(node):
ans = [node.val]
while node.val in parents:
node = parents[node.val]
ans.append(node.val)
return ans
traverse(root)
kParents = findParents(self.knode)
ans, dist = None, 0x7FFFFFFF
for leaf in leaves:
leafParents = findParents(leaf)
cross = [n for n in leafParents if n in kParents][0]
ndist = leafParents.index(cross) + kParents.index(cross)
if ndist < dist:
dist = ndist
ans = leaf
return ans.val
本文链接:http://bookshadow.com/weblog/2017/12/10/leetcode-closest-leaf-in-a-binary-tree/
请尊重作者的劳动成果,转载请注明出处!书影博客保留对文章的所有权利。