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-/

在C++中,为了找到二叉树中与给定元素距离为K的节点,我们可以使用深度优先搜索(DFS)或层次遍历(BFS)。这里提供一种基于BFS的方法,因为它能保证找到最近的节点。 首先,你需要定义一个表示二叉树节点的数据结构,例如: ```cpp struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} }; ``` 然后,你可以编写一个函数来求解这个问题: ```cpp int distanceK(TreeNode* root, int target, int K) { if (!root || !root->val) return -1; // 搜索结束,返回空指针或0 std::queue<TreeNode*> q; // 用于存储待访问节点 q.push(root); int targetDistance = 0; // 目标值到根的距离 while (!q.empty()) { int size = q.size(); for (int i = 0; i < size; ++i) { TreeNode* node = q.front(); q.pop(); if (node->val == target) { // 找到了目标节点 if (targetDistance + 1 == K) { return node->val; // 返回距离K的节点值 } else { continue; } } // 如果当前节点不是目标,递归检查左右子树 if (node->left && node->left->val != target) { q.push(node->left); } if (node->right && node->right->val != target) { q.push(node->right); } targetDistance += 1; // 更新目标值到当前节点距离 } } return -1; // 没有找到距离为K的节点 } ``` 在这个函数里,我们从根节点开始,如果遇到目标节点,会检查它到根的距离是否等于K减一;如果不是,我们会把它的子节点加入队列并继续搜索。如果没有找到符合条件的节点,最后返回-1。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值