在 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
广告