C++でツリーノードを削除する
ツリーがあり、このツリーはノード0をルートとしていると仮定します。これは、次のように与えられます-
- ノードの数はノードです
- i番目のノードの値はvalue[i]
- i番目のノードの親はparent[i]
ノードの値の合計が0であるすべてのサブツリーを削除する必要があります。削除すると、ツリーに残っているノードの数が返されます。したがって、ツリーが次のような場合-
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)
- 回答を返す
理解を深めるために、次の実装を見てみましょう-
#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
-
C++での木の直径
無向ツリーがあるとします。その直径を見つける必要があります-そのツリーの最長パスのエッジの数は、そのツリーの直径です。ここで、ツリーはエッジリストとして与えられます。ここで、edges [i] =[u、v]は、ノードuとvの間の双方向エッジです。各ノードには、セット{0、1、...、edges.length}にラベルがあります。したがって、グラフが次のような場合- 出力は4になります。 これを解決するには、次の手順に従います- マップを定義するl dfs()というメソッドを定義します。これには、v、visitedと呼ばれる配列、グラフ、およびcが必要です。次のように機能します-
-
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(ルートの左側)