Leetcode
medium
tree
dfs
bfs
python
c++
Learn More →
Learn More →
Learn More →
此題為給一target目標節點,返回所有跟target相距k步的節點
DFS+BFS拜訪
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
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)
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
/**
* 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;
}
};
###### tags: Leetcode easy python c++ string Top 100 Liked Questions
Aug 21, 2023[題目連結:] https://leetcode.com/problems/koko-eating-bananas/ 題目: 解題想法: 此題為有n串香蕉,第i串有piles[i]根香蕉守衛h小時回來 設一小時能吃k根香蕉吃完第i串後無法再同一小時內吃另外第j串 若第i串有x根香蕉,且x<k,則依舊需要等該小時過完,才能繼續下一串,意思為: 若有餘數需無條件進位1小時 求k使得能以最慢速度吃完所有香蕉
Mar 30, 2023[題目連結:] https://leetcode.com/problems/range-sum-query-immutable/description/ 題目: 解題想法: 此題為設計實做一個NumArray類別,使用sumRange(i, j) 時要能夠回傳[i, j]範圍內的和 prefix sum前綴和想法self.nums紀錄原本的數組 self.sumArray紀錄從頭到nums[i]的和 最終 self.sumArray[right]-self.sumArray[left]+self.nums[left]即為解 ex: nums =[-2, 0, 3, -5, 2, -1]
Mar 29, 2023[題目連結:] https://leetcode.com/problems/nim-game/description/ 題目: 解題想法: 此題目為給n個石頭,你與對手每次可以拿走1~3顆最先拿完的人獲勝 你先開始拿 判斷是否你能獲勝 基本的if else判斷是否為4的倍數即可
Mar 29, 2023or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up