comments | difficulty | edit_url | tags | |||||
---|---|---|---|---|---|---|---|---|
true |
中等 |
|
给定一个二叉树(具有根结点 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
我们先用 DFS 遍历整棵树,将每个节点的父节点保存到哈希表
接下来,我们再次用 DFS,从
时间复杂度
# 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 dfs(root, fa):
if root is None:
return
g[root] = fa
dfs(root.left, root)
dfs(root.right, root)
def dfs2(root, fa, k):
if root is None:
return
if k == 0:
ans.append(root.val)
return
for nxt in (root.left, root.right, g[root]):
if nxt != fa:
dfs2(nxt, root, k - 1)
g = {}
dfs(root, None)
ans = []
dfs2(target, None, k)
return ans
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private Map<TreeNode, TreeNode> g = new HashMap<>();
private List<Integer> ans = new ArrayList<>();
public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
dfs(root, null);
dfs2(target, null, k);
return ans;
}
private void dfs(TreeNode root, TreeNode fa) {
if (root == null) {
return;
}
g.put(root, fa);
dfs(root.left, root);
dfs(root.right, root);
}
private void dfs2(TreeNode root, TreeNode fa, int k) {
if (root == null) {
return;
}
if (k == 0) {
ans.add(root.val);
return;
}
for (TreeNode nxt : new TreeNode[] {root.left, root.right, g.get(root)}) {
if (nxt != fa) {
dfs2(nxt, root, k - 1);
}
}
}
}
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> distanceK(TreeNode* root, TreeNode* target, int k) {
unordered_map<TreeNode*, TreeNode*> g;
vector<int> ans;
auto dfs = [&](this auto&& dfs, TreeNode* node, TreeNode* fa) {
if (!node) return;
g[node] = fa;
dfs(node->left, node);
dfs(node->right, node);
};
auto dfs2 = [&](this auto&& dfs2, TreeNode* node, TreeNode* fa, int k) {
if (!node) return;
if (k == 0) {
ans.push_back(node->val);
return;
}
for (auto&& nxt : {node->left, node->right, g[node]}) {
if (nxt != fa) {
dfs2(nxt, node, k - 1);
}
}
};
dfs(root, nullptr);
dfs2(target, nullptr, k);
return ans;
}
};
func distanceK(root *TreeNode, target *TreeNode, k int) []int {
g := make(map[*TreeNode]*TreeNode)
ans := []int{}
var dfs func(node, fa *TreeNode)
dfs = func(node, fa *TreeNode) {
if node == nil {
return
}
g[node] = fa
dfs(node.Left, node)
dfs(node.Right, node)
}
var dfs2 func(node, fa *TreeNode, k int)
dfs2 = func(node, fa *TreeNode, k int) {
if node == nil {
return
}
if k == 0 {
ans = append(ans, node.Val)
return
}
for _, nxt := range []*TreeNode{node.Left, node.Right, g[node]} {
if nxt != fa {
dfs2(nxt, node, k-1)
}
}
}
dfs(root, nil)
dfs2(target, nil, k)
return ans
}
/**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/
function distanceK(root: TreeNode | null, target: TreeNode | null, k: number): number[] {
const g = new Map<TreeNode, TreeNode | null>();
const ans: number[] = [];
const dfs = (node: TreeNode | null, fa: TreeNode | null) => {
if (!node) {
return;
}
g.set(node, fa);
dfs(node.left, node);
dfs(node.right, node);
};
const dfs2 = (node: TreeNode | null, fa: TreeNode | null, k: number) => {
if (!node) {
return;
}
if (k === 0) {
ans.push(node.val);
return;
}
for (const nxt of [node.left, node.right, g.get(node) || null]) {
if (nxt !== fa) {
dfs2(nxt, node, k - 1);
}
}
};
dfs(root, null);
dfs2(target, null, k);
return ans;
}