이진 트리, 대상 노드 및 1 값 K가 있다고 가정합니다. 대상 노드에서 거리가 K인 모든 노드의 값 목록을 찾아야 합니다.
따라서 입력이 root =[3,5,1,6,2,0,8,null,null,7,4], target =5, K =2와 같으면 출력은 [7,4 ,1], 대상 노드에서 거리가 2인 노드의 값이 7, 4, 1이기 때문입니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
dfs() 함수를 정의합니다. 이것은 노드를 가져오고, pa는 NULL로 초기화합니다.
-
노드가 null이면 -
-
반환
-
-
부모[노드] :=pa
-
dfs(노드의 왼쪽, 노드)
-
dfs(노드 오른쪽, 노드)
-
주요 방법에서 다음을 수행하십시오 -
-
배열 정의
-
dfs(루트)
-
(노드, 값) 쌍에 대해 하나의 큐 q 정의
-
q에 { target, 0 } 삽입
-
방문이라고 하는 하나의 집합을 정의합니다.
-
방문 대상 삽입
-
동안(q가 비어 있지 않음) -
를 수행합니다.-
한 쌍 정의 p :=q의 첫 번째 요소
-
q에서 요소 삭제
-
level :=temp의 두 번째 요소
-
node =temp의 첫 번째 요소
-
레벨이 k와 같으면 -
-
ans
끝에 노드 값 삽입
-
-
노드의 왼쪽이 null이 아니고 레벨 + 1 <=k이고 노드의 왼쪽이 방문되지 않은 경우
-
q에 {노드 왼쪽, 레벨 + 1}) 삽입
-
노드의 왼쪽을 방문한 세트에 삽입
-
-
노드의 오른쪽이 null이 아니고 레벨 + 1 <=k이고 노드의 오른쪽이 방문되지 않은 경우
-
q에 {노드 오른쪽, 레벨 + 1}) 삽입
-
노드의 오른쪽을 방문한 세트에 삽입
-
-
부모[노드]가 NULL이 아니고 레벨 + 1 <=k이고 부모[노드]가 방문되지 않은 경우 -
-
q에 { parent[node], level + 1 } 삽입
-
방문
에 부모[노드] 삽입
-
-
-
반환
예시
더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h> using namespace std; void print_vector(vector<int> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } class TreeNode{ public: int val; TreeNode *left, *right; TreeNode(int data){ val = data; left = NULL; right = NULL; } }; void insert(TreeNode **root, int val){ queue<TreeNode*> q; q.push(*root); while(q.size()){ TreeNode *temp = q.front(); q.pop(); if(!temp->left){ if(val != NULL) temp->left = new TreeNode(val); else temp->left = new TreeNode(0); return; }else{ q.push(temp->left); } if(!temp->right){ if(val != NULL) temp->right = new TreeNode(val); else temp->right = new TreeNode(0); return; }else{ q.push(temp->right); } } } TreeNode *make_tree(vector<int> v){ TreeNode *root = new TreeNode(v[0]); for(int i = 1; i<v.size(); i++){ insert(&root, v[i]); } return root; } class Solution { public: map <TreeNode*, TreeNode*> parent; void dfs(TreeNode* node, TreeNode* pa = NULL){ if (!node) return; parent[node] = pa; dfs(node->left, node); dfs(node->right, node); } vector<int> distanceK(TreeNode* root, TreeNode* target, int k) { vector<int> ans; parent.clear(); dfs(root); queue<pair<TreeNode*, int> > q; q.push({ target, 0 }); set<TreeNode*> visited; visited.insert(target); while (!q.empty()) { pair<TreeNode*, int> temp = q.front(); q.pop(); int level = temp.second; TreeNode* node = temp.first; if (level == k) { ans.push_back(node->val); } if ((node->left && node->left->val != 0) && level + 1 <= k && !visited.count(node->left)) { q.push({ node->left, level + 1 }); visited.insert(node->left); } if ((node->right && node->right->val != 0) && level + 1 <= k && !visited.count(node->right)){ q.push({ node->right, level + 1 }); visited.insert(node->right); } if (parent[node] != NULL && level + 1 <= k && !visited.count(parent[node])) { q.push({ parent[node], level + 1 }); visited.insert(parent[node]); } } return ans; } }; main(){ Solution ob; vector<int> v = {3,5,1,6,2,0,8,NULL,NULL,7,4}; TreeNode *root = make_tree(v); TreeNode *target = root->left; print_vector(ob.distanceK(root, target, 2)); }
입력
{3,5,1,6,2,0,8,NULL,NULL,7,4}
출력
[7, 4, 1, ]