题目:原题链接(中等)
标签:树、二叉树、深度优先搜索、哈希表
| 解法 | 时间复杂度 | 空间复杂度 | 执行用时 | 
| Ans 1 (Python) | O ( N ) | O ( N ) | 56ms (78.79%) | 
| Ans 2 (Python) | |||
| Ans 3 (Python) | 
解法一(两次深度优先搜索):
class Solution:
    def __init__(self):
        self.hashmap = {}
    def findClosestLeaf(self, root: TreeNode, k: int) -> int:
        # 标记每个节点的子节点中的最近叶子节点
        # 时间:O(N) 空间:O(N)
        self.dfs1(root)
        # 寻找目标节点并计算最近的叶子节点
        # 时间:O(N) 空间:O(N)
        return self.dfs2(root, None, k)
    def dfs1(self, node):
        if node.left and node.right:
            d1, n1 = self.dfs1(node.left)
            d2, n2 = self.dfs1(node.right)
            if d1 <= d2:
                d, n = d1, n1
            else:
                d, n = d2, n2
            self.hashmap[node] = (d + 1, n)
            return d + 1, n
        elif node.left:
            d, n = self.dfs1(node.left)
            self.hashmap[node] = (d + 1, n)
            return d + 1, n
        elif node.right:
            d, n = self.dfs1(node.right)
            self.hashmap[node] = (d + 1, n)
            return d + 1, n
        else:
            d, n = 0, node.val
            self.hashmap[node] = (d, n)
            return d, n
    # 寻找目标节点并计算最近的叶子节点
    def dfs2(self, node, parent, k):
        if node:
            # 计算更新当前节点的最近叶子节点
            if parent:
                d1, n1 = self.hashmap[node]
                d2, n2 = self.hashmap[parent]
                if d1 > d2 + 1:
                    self.hashmap[node] = d2 + 1, n2
            # 寻找目标节点
            if node.val == k:
                return self.hashmap[node][1]
            else:
                return self.dfs2(node.left, node, k) or self.dfs2(node.right, node, k)
        else:
            return None









