题目地址(863. 二叉树中所有距离为 K 的结点)

题目地址(863. 二叉树中所有距离为 K 的结点)

https://leetcode.cn/problems/all-nodes-distance-k-in-binary-tree/

题目描述

给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 k 。

返回到目标结点 target 距离为 k 的所有结点的值的列表。 答案可以以 任何顺序 返回。

 

示例 1:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, k = 2
输出:[7,4,1]
解释:所求结点为与目标结点(值为 5)距离为 2 的结点,值分别为 7,4,以及 1


示例 2:

输入: root = [1], target = 1, k = 3
输出: []


 

提示:

节点数在 [1, 500] 范围内
0 <= Node.val <= 500
Node.val 中所有值 不同
目标结点 target 是树上的结点。
0 <= k <= 1000

 

前置知识

公司

  • 暂无

思路

关键点

代码

  • 语言支持:Python3

Python3 Code:


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

class Solution:
    def distanceK(self, root: TreeNode, target: TreeNode, k: int) -> List[int]:
        # 返回到目标结点target距离为k的所有结点的值的列表 
        # 首先,咱们知道树是一种特殊的图(单向的,只能从子结点开始遍历),但是由于该题需要计算距离(可以从父节点遍历),因此可以先让树变成有向图,然后遍历图
        # 由于该题的结点值各不相同,因此可以采用哈希表来存储父结点信息
        node_parent = dict() # key为子节点 value为父节点

        def dfs_find_parent(node):
            if node:
                if node.left:
                    node_parent[node.left] = node
                if node.right:
                    node_parent[node.right] = node
                dfs_find_parent(node.left)
                dfs_find_parent(node.right)
        dfs_find_parent(root)

        # 边界条件判断
        if k == 0:
            return [target.val]
        
        res = []

        Q = collections.deque()
        visited = set()
        Q.append(target)
        visited.add(target)
        level = 0
        while Q and level<k:
            level += 1
            for _ in range(len(Q)):
                x = Q.popleft()
                # 遍历三个方向 父节点 左子树 右子树
                for y in [node_parent[x] if x in node_parent else None, x.left, x.right]:
                    if y and y not in visited:
                        if level == k:
                            res.append(y.val)
                        Q.append(y)
                        visited.add(y)
        return res



Python3 Code:


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

class Solution:
    def distanceK(self, root: TreeNode, target: TreeNode, k: int) -> List[int]:
        # 返回到目标结点target距离为k的所有结点的值的列表 
        # 首先,咱们知道树是一种特殊的图(单向的,只能从子结点开始遍历),但是由于该题需要计算距离(可以从父节点遍历),因此可以先让树变成有向图,然后遍历图
        # 由于该题的结点值各不相同,因此可以采用哈希表来存储父结点信息
        node_parent = dict() # key为子节点 value为父节点

        def dfs_find_parent(node):
            if node:
                if node.left:
                    node_parent[node.left] = node
                if node.right:
                    node_parent[node.right] = node
                dfs_find_parent(node.left)
                dfs_find_parent(node.right)
        dfs_find_parent(root)

        # 采用DFS
        def dfs_find_res(node,prev,cur_dist):
            if node:
                if cur_dist == k:
                    res.append(node.val)
                    return 
                if node.left != prev:
                    dfs_find_res(node.left,node,cur_dist+1)
                if node.right != prev:
                    dfs_find_res(node.right,node,cur_dist+1)
                if node in node_parent and node_parent[node] != prev:
                    dfs_find_res(node_parent[node],node,cur_dist+1)
        
        res = []
        dfs_find_res(target,None,0)
        return res 



复杂度分析

令 n 为数组长度。

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值