C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

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であるためです。

C++の二分木のすべてのノード距離K

これを解決するには、次の手順に従います-

  • 関数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, ]

  1. C++のバイナリツリーでルートから特定のノードまでの距離を検索します

    ノードが少ない二分木があると考えてください。ルートと別のノードuの間の距離を見つける必要があります。ツリーが次のようになっているとします。 これで、(root、6)=2の間の距離、パスの長さは2、(root、8)=3の間の距離などになります。 この問題を解決するために、再帰的アプローチを使用して、左右のサブツリーでノードを検索し、各レベルの長さも更新します。 例 #include<iostream> using namespace std; class Node {    public:       int data; &

  2. 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