在 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

更新于:2022-01-25

332 次查看

启动你的 职业生涯

通过完成课程获得认证

开始
广告