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(ルートの左側)+ countNodes(ルートの右側)
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h>
using namespace std;
class TreeNode{
public:
int val;
TreeNode *left, *right;
TreeNode(int data){
val = data;
left = 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:
int fastPow(int base, int power){
int res = 1;
while(power > 0){
if(power & 1) res *= base;
base *= base;
power >>= 1;
}
return res;
}
int countNodes(TreeNode* root) {
int hr = 0;
int hl = 0;
TreeNode* l = root;
TreeNode* r = root;
while(l){
hl++;
l = l->left;
}
while(r){
r = r->right;
hr++;
}
if(hl == hr) return fastPow(2, hl) - 1;
return 1 + countNodes(root->left) + countNodes(root->right);
}
};
main(){
Solution ob;
vector<int> v = {1,2,3,4,5,6,7,8,9,10};
TreeNode *node = make_tree(v);
cout << (ob.countNodes(node));
} 入力
[1,2,3,4,5,6,7,8,9,10]
出力
10
-
C++でツリーノードを削除する
ツリーがあり、このツリーはノード0をルートとしていると仮定します。これは、次のように与えられます- ノードの数はノードです i番目のノードの値はvalue[i] i番目のノードの親はparent[i] ノードの値の合計が0であるすべてのサブツリーを削除する必要があります。削除すると、ツリーに残っているノードの数が返されます。したがって、ツリーが次のような場合- 7つのノードがあり、出力は2になります これを解決するには、次の手順に従います- 子供と呼ばれる地図を作成する dfs()というメソッドを定義します。これにより、ノード、配列値、グラフが取得されます temp:=ペ
-
C++のバイナリツリーですべての完全なノードを印刷します
この問題では、二分木が与えられます。私たちのタスクは、完全なノードであるツリーのすべてのノードを印刷することです。 二分木 は、ノードが最大2つの子ノードを持つことができるツリーです。ノードまたは頂点にノードを含めることはできません。1つの子ノードまたは2つの子ノードを使用できます。 例 − フルノード は、左と右の両方の子が使用可能なノードです。つまり、左右の子を持つノードは完全なノードです。上記の二分木では、4と9は完全なノードです。 問題を理解するために例を見てみましょう- 出力 − 4 9 この問題を解決するためのシンプルで簡単なアプローチは、任意のトラバー