C++で特定の二分木にあるすべての左葉の合計を求めます
この問題では、二分木が与えられます。私たちのタスクは、特定の二分木に残っているすべての葉の合計を見つけることです 。
問題を理解するために例を見てみましょう
入力:
出力:11
説明 −
All leaf nodes of the tree are : 2, 9 Sum = 2 + 9 = 11
ソリューションアプローチ
この問題の簡単な解決策は、ツリーをルートからリーフにトラバースすることです。ノードが左リーフノードの場合は、合計に追加します。ツリー全体がトラバースされるとき。合計を印刷します。
例
ソリューションの動作を説明するプログラム
#include <iostream> using namespace std; struct Node{ int key; struct Node* left, *right; }; Node *newNode(char k){ Node *node = new Node; node->key = k; node->right = node->left = NULL; return node; } bool isLeafNode(Node *node){ if (node == NULL) return false; if (node->left == NULL && node->right == NULL) return true; return false; } int findLeftLeavesSum(Node *root){ int sum = 0; if (root != NULL){ if (isLeafNode(root->left)) sum += root->left->key; else sum += findLeftLeavesSum(root->left); sum += findLeftLeavesSum(root->right); } return sum; } int main(){ struct Node *root = newNode(5); root->left = newNode(4); root->right = newNode(6); root->left->left = newNode(2); root->left->right = newNode(1); root->right->left = newNode(9); root->right->right = newNode(7); cout<<"The sum of left leaves of the tree is "<<findLeftLeavesSum(root); return 0; }
出力
The sum of left leaves of the tree is 11
反復を使用する別のアプローチ
ツリーで深さ優先探索トラバーサルを実行し、次に現在のノードが左葉であるかどうかを確認します。はいの場合はその値を合計に加算し、そうでない場合はそのままにします。最後に、合計を印刷します。
例
ソリューションの動作を説明するプログラム
#include<bits/stdc++.h> using namespace std; struct Node{ int key; struct Node* left, *right; }; Node *newNode(char k){ Node *node = new Node; node->key = k; node->right = node->left = NULL; return node; } int findLeftLeavesSum(Node* root){ if(root == NULL) return 0; stack<Node*> treeNodes; treeNodes.push(root); int sum = 0; while(treeNodes.size() > 0){ Node* currentNode = treeNodes.top(); treeNodes.pop(); if (currentNode->left != NULL){ treeNodes.push(currentNode->left); if(currentNode->left->left == NULL && currentNode->left->right == NULL){ sum += currentNode->left->key ; } } if (currentNode->right != NULL) treeNodes.push(currentNode->right); } return sum; } int main(){ Node *root = newNode(5); root->left= newNode(4); root->right = newNode(6); root->left->left = newNode(2); root->left->right = newNode(1); root->right->left = newNode(9); root->right->right= newNode(7); cout<<"The sum of left leaves of the tree is "<<findLeftLeavesSum(root); return 0; }
出力
The sum of left leaves of the tree is 11
アプローチ3、BFSを使用
ノードが子のままであるかどうかを示すために、変数を使用して幅優先探索を実行します。そうである場合は、合計に追加し、そうでない場合はそのままにします。最後に、合計を印刷します。
例
ソリューションの動作を説明するプログラム
#include<bits/stdc++.h> using namespace std; struct Node{ int key; struct Node* left, *right; }; Node *newNode(char k){ Node *node = new Node; node->key = k; node->right = node->left = NULL; return node; } int findLeftLeavesSum(Node* root) { if (root == NULL) return 0; queue<pair<Node*, bool> > leftTreeNodes; leftTreeNodes.push({ root, 0 }); int sum = 0; while (!leftTreeNodes.empty()) { Node* temp = leftTreeNodes.front().first; bool is_left_child = leftTreeNodes.front().second; leftTreeNodes.pop(); if (!temp->left && !temp->right && is_left_child) sum = sum + temp->key; if (temp->left) { leftTreeNodes.push({ temp->left, 1 }); } if (temp->right) { leftTreeNodes.push({ temp->right, 0 }); } } return sum; } int main(){ Node *root = newNode(5); root->left= newNode(4); root->right = newNode(6); root->left->left = newNode(2); root->left->right = newNode(1); root->right->left = newNode(9); root->right->right= newNode(7); cout<<"The sum of left leaves of the tree is "<<findLeftLeavesSum(root); return 0; }
出力
The sum of left leaves of the tree is 11
-
C++の二分木で最大垂直和を見つける
二分木があるとします。タスクは、垂直順序トラバーサルのすべてのノードの合計の最大値を出力することです。したがって、ツリーが以下のようになっている場合- 垂直方向の走査は-のようなものです 4 2 1 + 5 + 6 = 12 3 + 8 = 11 7 9 ここでの最大値は12です。アプローチは単純です。垂直順序トラバーサルを実行してから、合計を見つけて最大値を確認します。 例 #include<iostream> #include<map> #include<vector> #include<queue> using namespace
-
C++で与えられた完全な二分木のすべてのノードの合計を見つけます
完全な二分木のレベル数を表す正の整数Lがあるとします。この完全な二分木のリーフノードには、1からnまでの番号が付けられています。ここで、nはリーフノードの数です。親ノードは子の合計です。私たちの仕事は、この完璧な二分木のすべてのノードの合計を出力するプログラムを書くことです。したがって、ツリーが以下のようになっている場合- したがって、合計は30です。 よく見ると、すべてのノードの合計を見つける必要があります。リーフノードは1からnまでの値を保持しているため、式n(n + 1)/2を使用してリーフノードの合計を取得できます。これは完全な二分木であるため、各レベルの合計は同じになります