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

给定一个二叉树(具有根结点 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

注意,输入的 "root" 和 "target" 实际上是树上的结点。
上面的输入仅仅是对这些对象进行了序列化描述。

提示:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:树转图,然后从目标节点出发,dfs遍历所有节点。

代码

class TreeNode{
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode parent;
    TreeNode(int x) {
        val = x;
    }
} 
class Solution {
    // 记录目标节点
    public static int targetNum;
    public TreeNode targetNode;
    // 树转图
    public void treeToGraph(TreeNode root) {
        if (root != null) {
            // 只是用来记录目标节点
            if (root.val == targetNum) {
                targetNode = root;
            }

            if (root.left != null) {
                root.left.parent = root;
            }
            if (root.right != null) {
                root.right.parent = root;
            }
            treeToGraph(root.left);
            treeToGraph(root.right);
        }

    }

    public List<Integer> list = new ArrayList<>();
    Map<Integer,Boolean> map = new HashMap<>();
    // 然后从目标点出发,找到与之距离为K的节点
    public void dfs(TreeNode root, int K, int sum) {
        // 防止重复访问相同节点 并且减枝
        if (root != null && map.get(root.val) == null && sum <= K) {
            // 标记使得当前的节点已经被访问
            map.put(root.val,true);
            // 记录与之距离为K的节点
            if (sum == K) {
                list.add(root.val);
            }

            //System.out.println( root.val + " parent :" + (root.parent == null ? null : root.parent.val)
            //        + " ,left : " + (root.left == null ? null : root.left.val) +
            //        " ,right : " + (root.right == null ? null : root.right.val) );
            dfs(root.parent, K, sum + 1);
            dfs(root.left, K, sum + 1);
            dfs(root.right, K, sum + 1);
        }
    }
    public List<Integer> distanceK(TreeNode root, TreeNode target, int K) {
        targetNum = target.val;
        // 先进行树转图
        treeToGraph(root);
        // 然后从目标节点出发
        dfs(targetNode, K, 0);
        return list;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值