863. 二叉树中所有距离为 K 的结点

863. 二叉树中所有距离为 K 的结点

原始题目链接:https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree/

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

返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。
在这里插入图片描述
提示:

给定的树是非空的。
树上的每个结点都具有唯一的值 0 <= node.val <= 500 。
目标结点 target 是树上的结点。
0 <= K <= 1000.

解题思路:

1、给每个节点增加一个指向其父节点的引用,可以用深度优先遍历DFS递归实现。
2、从目标节点出发,题目要求距离为K,则for循环遍历K次,用两个列表分别存储当前层的节点和已经遍历过的节点,可以用层序遍历BFS实现。注意:已经遍历过的节点列表用于去重,如果不进行判断的话会来回往复查询。具体实现看代码。

代码实现:

# 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]:
        # 为树中的所有节点增加一个指向父节点的引用
        def add_parent(root, parent=None):
            if root:
                root.par = parent
                add_parent(root.left, root)
                add_parent(root.right, root)
        
        add_parent(root)

        # 因为要找距离为K的所有节点,从目标节点开始查找距离为K的所有节点
        # for循环遍历的上界定为K
        # 从target节点所在的层开始算起,当前层的节点列表
        # 初始化为target节点
        cur_node_list = [target]
        # 已遍历到的节点列表,也从target节点开始算起
        seen_node_list = [target]
        for _ in range(K):
            # 遍历的当前层节点的同时,记录当前层节点的左、右、父节点
            cur_node_new = []
            for node in cur_node_list:
                # 遍历当前层节点的左、右、父节点
                for n in (node.left, node.right, node.par):
                    # 是否出现在已经遍历的节点列表中,避免重复查询
                    if n and n not in seen_node_list:
                        seen_node_list.append(n)
                        cur_node_new.append(n)
            
            # 最外层for循环自增表示进入到了下一层
            # 所以要更新下一次遍历的当前层的节点
            cur_node_list = cur_node_new
        
        # 返回答案,for循环结束,cur_node_list已经包含了距离为K的所有节点
        return [node.val for node in cur_node_list]

参考文献:
https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree/solution/pythonbfsjie-dian-ke-zhi-jie-gou-jian-fu-jie-dian-/
https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree/solution/er-cha-shu-zhong-suo-you-ju-chi-wei-k-de-jie-dian-/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值