在 C++ 中查詢給定二叉樹中所有右葉子的和
在這個問題中,我們給定一個二叉樹。我們的任務是找到給定二叉樹中所有右葉子的和。
讓我們舉一個例子來理解這個問題,
輸入

輸出:8
解釋 -
All leaf nodes of the tree are : 1, 8 Sum = 1 + 8 = 9
解決方案方法
解決此問題的一個簡單方案是從根節點到葉子節點遍歷樹。如果一個節點是左葉子節點,則將其新增到總和中。遍歷完整棵樹後。列印總和。
示例
程式說明我們解決方案的工作原理
#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 findRightLeavesSum(Node *root){
int sum = 0;
if (root != NULL){
if (isLeafNode(root->right))
sum += root->right->key;
else
sum += findRightLeavesSum(root->right);
sum += findRightLeavesSum(root->left);
}
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 right leaves of the tree is "<<findRightLeavesSum(root);
return 0;
}輸出
The sum of right leaves of the tree is 8
另一種使用迭代的方法
我們將對樹執行深度優先搜尋遍歷,然後檢查當前節點是否為右葉子。如果是,則將其值新增到總和中,否則跳過。最後,列印總和。
示例
程式說明我們解決方案的工作原理
#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 findRightLeavesSum(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->right != NULL){
treeNodes.push(currentNode->right);
if(currentNode->right->right == NULL &&
currentNode->right->left == NULL){
sum += currentNode->right->key ;
}
}
if (currentNode->left != NULL)
treeNodes.push(currentNode->left);
}
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 right leaves of the tree is "<<findRightLeavesSum(root);
return 0;
}輸出
The sum of right leaves of the tree is 8
方法 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 findRightLeavesSum(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, 0 });
}
if (temp->right) {
leftTreeNodes.push({ temp->right, 1 });
}
}
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 right leaves of the tree is "<<findRightLeavesSum(root);
return 0;
}輸出
The sum of right leaves of the tree is 8
廣告
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP