###### tags: `Leetcode` `medium` `tree` `dfs` `bfs` `python` `c++` # 863. All Nodes Distance K in Binary Tree ## [題目連結:] https://leetcode.com/problems/all-nodes-distance-k-in-binary-tree/description/ ## 題目: ![](https://i.imgur.com/FMcZFzX.png) ![](https://i.imgur.com/5b4z4tR.png) ![](https://i.imgur.com/CwN9EIr.png) ## 解題想法: * 此題為給一target目標節點,返回所有跟target相距k步的節點 * 各點值皆不重複 * **可往上拜訪父點,也可往下拜訪子點** * DFS+BFS拜訪 * 所需工具: * dic= collections.defaultdict(list) * {**key:某點的值** ; **value:與他相連的所有鄰居的值**} * ex: dic[5]={3,6,2} * que=collections.deque() * bfs用來紀錄目前走到哪層 * visited=set() * 紀錄已拜訪過的節點 * 額外函式 dfs(parent, child, dic): 分別將父點與子點關係紀錄於dic中,並遞迴紀錄 ``` python= def dfs(self, parent, child, dic): if parent and child: dic[parent.val].append(child.val) dic[child.val].append(parent.val) if child.left: self.dfs(child, child.left, dic) if child.right: self.dfs(child, child.right, dic) return ``` * 主函式: 目標擴展k層 * 第一層:5 * 第二層:3,2,6 * 第三層(res):1 7 4 ``` python= for _ in range(k): #擴展K層 n=len(que) for i in range(len(que)): curNode=que.popleft() for neighber in dic[curNode]: if neighber not in visited: visited.add(neighber) que.append(neighber) return list(que) ``` ## Python: ``` python= from collections import defaultdict, deque # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution(object): def distanceK(self, root, target, k): """ :type root: TreeNode :type target: TreeNode :type k: int :rtype: List[int] """ dic=defaultdict(list) que=deque() self.dfs(None, root, dic) que.append(target.val) visited=set({target.val}) #紀錄已拜訪過的點 #擴展K層 第一層:5 第二層:3,2,6 第三層(res):1 7 4 for _ in range(k): n=len(que) for i in range(len(que)): curNode=que.popleft() for neighber in dic[curNode]: if neighber not in visited: visited.add(neighber) que.append(neighber) return list(que) #key:某點的值 value:與他相連的所有鄰居的值 ex: dic[5]={3,6,2} def dfs(self, parent, child, dic): if parent and child: dic[parent.val].append(child.val) dic[child.val].append(parent.val) if child.left: self.dfs(child, child.left, dic) if child.right: self.dfs(child, child.right, dic) return ``` ## C++: ``` cpp= /** * 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<int, vector<int>> dic; queue<int> que; set<int> visited; dfs(nullptr, root, dic); que.push(target->val); visited.insert(target->val); //run k times for (int i=0; i<k; i++){ int n=que.size(); for (int j=0; j<n; j++){ int curNode=que.front(); que.pop(); for (auto neighber: dic[curNode]){ //not visited yet if (!visited.count(neighber)){ visited.insert(neighber); que.push(neighber); } } } } vector<int> res; int num=que.size(); for (int i=0; i<num; i++){ int tmp=que.front(); que.pop(); res.push_back(tmp); } return res; } void dfs(TreeNode* parent, TreeNode* child, unordered_map<int, vector<int>>& dic){ if (parent && child){ dic[parent->val].push_back(child->val); dic[child->val].push_back(parent->val); } if (child->left) dfs(child, child->left, dic); if (child->right) dfs(child, child->right, dic); return; } }; ```