1. 程式人生 > 其它 >863. 二叉樹中所有距離為 K 的結點

863. 二叉樹中所有距離為 K 的結點

給定一個二叉樹(具有根結點root),一個目標結點target,和一個整數值 K 。

返回到目標結點 target 距離為 K 的所有結點的值的列表。 答案可以以任何順序返回。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

class Solution {

    private int k;

    private Map<TreeNode, TreeNode> parentMap = new HashMap<>();

    private List<Integer> ans = new ArrayList<>();

    private void dfs1(TreeNode root, TreeNode parent) {
        if (root == null) {
            return;
        }
        parentMap.put(root, parent);
        dfs1(root.left, root);
        dfs1(root.right, root);
    }

    private void dfs2(TreeNode root, TreeNode pre, int deep) {
        if (deep == k) {
            ans.add(root.val);
            return;
        }
        TreeNode parent = parentMap.get(root);
        if (parent != null && pre != parent) {
            dfs2(parent, root, deep + 1);
        }

        if (root.left != null && pre != root.left) {
            dfs2(root.left, root, deep + 1);
        }

        if (root.right != null && pre != root.right) {
            dfs2(root.right, root, deep + 1);
        }
    }

    public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
        this.k = k;
        dfs1(root, null);
        dfs2(target, null, 0);
        return ans;
    }
}

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}

心之所向,素履以往 生如逆旅,一葦以航