C++でツリーを偶数ノードのフォレストに変換します
このチュートリアルでは、ツリーを偶数ノードのフォレストに変換するプログラムについて説明します。
このために、たとえばNノードの二分木が提供されます。私たちのタスクは、ノードのフォレストを取得するために削除できるエッジの最大数を計算することです。
例
#include<bits/stdc++.h>
#define N 12
using namespace std;
//returning the number of nodes of subtree
//having the root node
int depth_search(vector<int> tree[N], int visit[N], int *ans, int node){
int num = 0, temp = 0;
//marking nodes as visited
visit[node] = 1;
for (int i = 0; i < tree[node].size(); i++){
if (visit[tree[node][i]] == 0){
//finding total nodes of the sub subtree
temp = depth_search(tree, visit, ans, tree[node][i]);
//if nodes are even, increment the edges to be removed by 1
(temp%2)?(num += temp):((*ans)++);
}
}
return num+1;
}
//returning the maximum number of edges to be removed
int print_maxedge(vector<int> tree[N], int n){
int visit[n+2];
int ans = 0;
memset(visit, 0, sizeof visit);
depth_search(tree, visit, &ans, 1);
return ans;
}
int main(){
int n = 10;
vector<int> tree[n+2];
tree[1].push_back(3);
tree[3].push_back(1);
tree[1].push_back(6);
tree[6].push_back(1);
tree[1].push_back(2);
tree[2].push_back(1);
tree[3].push_back(4);
tree[4].push_back(3);
tree[6].push_back(8);
tree[8].push_back(6);
tree[2].push_back(7);
tree[7].push_back(2);
tree[2].push_back(5);
tree[5].push_back(2);
tree[4].push_back(9);
tree[9].push_back(4);
tree[4].push_back(10);
tree[10].push_back(4);
cout << print_maxedge(tree, n) << endl;
return 0;
} 出力
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(ルートの左側)
-
C++で二分探索木のすべての偶数ノードを印刷します
この問題では、二分探索木が与えられます。私たちのタスクは、二分探索木のすべての偶数のノードを印刷することです。 二分探索木 次の条件に従う二分木です- 左側のサブツリーには、常に親ノードよりも小さい値のノードが含まれています。 そうです、サブツリーには常に親ノードよりも大きな値を持つノードが含まれています。 すべてのノードは、上記の2つのルールに従う必要があります。 二分探索木の例- 問題を理解するために例を見てみましょう- 出力 − 2 4 6 8 この問題を解決するには、バイナリ検索ツリーのすべてのノードをトラバースして、現在のノードの値を確認