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

C++のツリー内の特定のサブツリーのDFSトラバーサルでK番目のノードを検索します


この問題では、サイズNのツリー、ツリーVおよびkのノードが与えられます。私たちのタスクは、ツリー内の特定のサブツリーのDFSトラバーサルでK番目のノードを見つけることです。 。

頂点Vから始まるツリーのDFSトラバーサルでk番目のノードを見つける必要があります。

問題を理解するために例を見てみましょう

入力:

C++のツリー内の特定のサブツリーのDFSトラバーサルでK番目のノードを検索します

V =2、k =3

出力:4

説明

The series is {1, 2, 3, 5, 6, 7}
The 4th element is 5.

ソリューションアプローチ

この問題の簡単な解決策は、ノードVのDFSトラバーサルを見つけて、そこからk番目の値を出力することです。

このために、ツリーのDFSトラバーサルを実行し、それをベクトルに格納します。このベクトルでは、V startの値が見つかります およびVend ツリーのDFSトラバーサルの開始と終了をマークします。次に、この範囲のk番目の値を見つけて、可能であれば印刷します。

ソリューションの動作を説明するプログラム

#include <bits/stdc++.h>
using namespace std;
#define N 100005
int n;
vector<int> tree[N];
int currentIdx;
vector<int> startIdx,endIdx;
vector<int> dfsTraversalVector;
void insertEdge(int u, int v){
   tree[u].push_back(v);
   tree[v].push_back(u);
}
void findDfsTraversal(int ch, int par){
   dfsTraversalVector[currentIdx] = ch;
   startIdx[ch] = currentIdx++;
   for (auto c : tree[ch]) {
      if (c != par)
         findDfsTraversal(c, ch);
   }
   endIdx[ch] = currentIdx - 1;
}
int findKNodeDfsV(int v, int k){
   k = k + (startIdx[v] - 1);
   if (k <= endIdx[v])
      return dfsTraversalVector[k];
   return -1;
}
int main(){
   n = 9;
   insertEdge(5, 8);
   insertEdge(5, 2);
   insertEdge(5, 10);
   insertEdge(5, 3);
   insertEdge(2, 6);
   insertEdge(2, 1);
   insertEdge(3, 9);
   insertEdge(6, 1);
   insertEdge(9, 7);
   startIdx.resize(n);
   endIdx.resize(n);
   dfsTraversalVector.resize(n);
   findDfsTraversal(5, 0);
   int v = 2,
   k = 4;
   cout<<k<<"-th node in DFS traversal of node "<<v<<" is "<<findKNodeDfsV(v, k);
   return 0;
}

出力

4-th node in DFS traversal of node 2 is 1

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

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

  2. C++で二分木の垂直方向の走査でk番目のノードを見つけます

    二分木と値Kがあるとします。タスクは、垂直方向の走査でK番目のノードを出力することです。そのようなノードが存在しない場合は、-1を返します。したがって、ツリーが以下のようになっている場合- 垂直方向の走査は-のようなものです 4 2 1 5 6 3 8 7 9 したがって、K =3の場合、結果は1になります。 アプローチは簡単です。垂直方向の走査を実行し、現在のノードがk番目のノードであるかどうかを確認し、そうである場合は戻ります。 例 #include<iostream> #include<map> #include<vector> #incl