C++の二分木のすべてのノード距離K
二分木、ターゲットノード、および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(root)
-
(ノード、値)ペアに対して1つのキューqを定義します
-
{target、0}をq
に挿入します -
訪問済みと呼ばれる1つのセットを定義します
-
訪問先にターゲットを挿入
-
(qが空ではない)間、-
-
1つのペアを定義しますp:=qの最初の要素
-
qから要素を削除
-
level:=tempの2番目の要素
-
node=温度の最初の要素。
-
レベルがkと同じ場合、-
-
ansの最後にノードの値を挿入します
-
-
ノードの左側がnullでなく、レベル+ 1 <=kであり、ノードの左側が訪問されていない場合、
-
{ノードの左側、レベル+ 1})をq
に挿入します -
訪問したセットにノードの左側を挿入します
-
-
ノードの右側がnullでなく、レベル+ 1 <=kであり、ノードの右側にアクセスしていない場合、
-
{ノードの右側、レベル+ 1})をq
に挿入します -
訪問したセットにノードの権利を挿入します
-
-
parent [node]がNULLでなく、レベル+ 1 <=kであり、parent [node]にアクセスしていない場合、-
-
{parent [node]、level+1}をq
に挿入します -
親[ノード]をvisited
に挿入します
-
-
-
ansを返す
例
理解を深めるために、次の実装を見てみましょう-
#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, ]
-
C++のバイナリツリーでルートから特定のノードまでの距離を検索します
ノードが少ない二分木があると考えてください。ルートと別のノードuの間の距離を見つける必要があります。ツリーが次のようになっているとします。 これで、(root、6)=2の間の距離、パスの長さは2、(root、8)=3の間の距離などになります。 この問題を解決するために、再帰的アプローチを使用して、左右のサブツリーでノードを検索し、各レベルの長さも更新します。 例 #include<iostream> using namespace std; class Node { public: int data; &
-
C++で二分木の2つのノード間の距離を見つける
ノードが少ない二分木があると考えてください。 2つのノードuとvの間の距離を見つける必要があります。ツリーが次のようになっていると仮定します- これで、(4、6)=4の間の距離、パスの長さは4、(5、8)の間の長さ=5などになります。 この問題を解決するために、LCA(Lowest Common Ancestor)を見つけてから、LCAから2つのノードまでの距離を計算します。 例 #include<iostream> using namespace std; class Node { public: in