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

C++でツリーノードを削除する


ツリーがあり、このツリーはノード0をルートとしていると仮定します。これは、次のように与えられます-

  1. ノードの数はノードです
  2. i番目のノードの値はvalue[i]
  3. i番目のノードの親はparent[i]

ノードの値の合計が0であるすべてのサブツリーを削除する必要があります。削除すると、ツリーに残っているノードの数が返されます。したがって、ツリーが次のような場合-

C++でツリーノードを削除する

7つのノードがあり、出力は2になります

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

  • 子供と呼ばれる地図を作成する
  • dfs()というメソッドを定義します。これにより、ノード、配列値、グラフが取得されます
  • temp:=ペア(value [node]、1)
  • 0からグラフのサイズまでの範囲のiの場合[ノード]
    • temp2:=dfs(graph [node、i]、value、graph)
    • 最初にtemp2の最初に増加し、2番目にtemp2の2番目に増加します
  • 最初の温度が0の場合、ans:=ans – 2番目の温度、2番目の温度を設定:=0
  • リターン温度
  • メインメソッドから、ノード、親配列、値配列を取得します
  • n:=値の配列に存在する値の数
  • ans:=n
  • サイズn+1の配列グラフを定義します
  • 1からn–1の範囲のiの場合
    • iをグラフに挿入[parent[i]]
  • dfs(0、value、graph)
  • 回答を返す
例(C ++)

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   map <int, int> children;
   int ans;
   pair <int, int> dfs(int node, vector<int>& value, vector <int> graph[]){
      pair <int, int> temp = {value[node], 1};
      for(int i = 0; i < graph[node].size(); i++){
         pair <int, int> temp2 = dfs(graph[node][i], value, graph);
         temp.first += temp2.first;
         temp.second += temp2.second;
      }
      if(temp.first == 0){
         ans -= temp.second;
         temp.second = 0;
      }
      return temp;
   }
   int deleteTreeNodes(int nodes, vector<int>& parent, vector<int>& value) {
      int n = value.size();
      ans = n;
      children.clear();
      vector < int > graph[n + 1];
      for(int i = 1; i < n; i++){
         graph[parent[i]].push_back(i);
      }
      dfs(0, value, graph);
      return ans;
   }
};
main(){
   vector<int> v1 = {-1,0,0,1,2,2,2};
   vector<int> v2 = {1,-2,4,0,-2,-1,-1};
   Solution ob;
   cout << (ob.deleteTreeNodes(7,v1, v2));
}

入力

7
[-1,0,0,1,2,2,2]
[1,-2,4,0,-2,-1,-1]

出力

2

  1. C++での木の直径

    無向ツリーがあるとします。その直径を見つける必要があります-そのツリーの最長パスのエッジの数は、そのツリーの直径です。ここで、ツリーはエッジリストとして与えられます。ここで、edges [i] =[u、v]は、ノードuとvの間の双方向エッジです。各ノードには、セット{0、1、...、edges.length}にラベルがあります。したがって、グラフが次のような場合- 出力は4になります。 これを解決するには、次の手順に従います- マップを定義するl dfs()というメソッドを定義します。これには、v、visitedと呼ばれる配列、グラフ、およびcが必要です。次のように機能します-

  2. C++で完全なツリーノードをカウントする

    完全な二分木があるとすると、ノードの数を数える必要があります。したがって、ツリーが次のような場合- したがって、出力は6になります。 これを解決するために、次の手順に従います これは再帰的アプローチを使用します。このメソッド、countNodes()は引数としてルートを取ります。 hr:=0およびhl:=0 ルートとして2つのノードlとrを作成します lが空でない間 hlを1増やします l:=lの左側 rが空でない間 r:=rの権利 時間を1増やします hl =hrの場合、(2 ^ hl)–1を返します return 1 + countNodes(ルートの左側)