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