最小级别的叶节点之和

给定一个包含 N 节点。问题是要得到二叉树中处于最低级别的所有叶节点的总和。 例如:

null
Input :               1            /              2     3         /     /          4   5   6   7           /               8       9Output : 11Leaf nodes 4 and 7 are at minimum level.Their sum = (4 + 7) = 11. 

资料来源: 微软IDC面试经验|设定150。

方法: 表演 迭代级序遍历 使用queue并查找包含叶节点的第一级。将此级别的所有叶节点相加,然后停止进一步执行遍历。

C++

// C++ implementation to find the sum of
// leaf nodes at minimum level
#include <bits/stdc++.h>
using namespace std;
// structure of a node of binary tree
struct Node {
int data;
Node *left, *right;
};
// function to get a new node
Node* getNode( int data)
{
// allocate space
Node* newNode = (Node*) malloc ( sizeof (Node));
// put in the data
newNode->data = data;
newNode->left = newNode->right = NULL;
return newNode;
}
// function to find the sum of
// leaf nodes at minimum level
int sumOfLeafNodesAtMinLevel(Node* root)
{
// if tree is empty
if (!root)
return 0;
// if there is only one node
if (!root->left && !root->right)
return root->data;
// queue used for level order traversal
queue<Node*> q;
int sum = 0;
bool f = 0;
// push root node in the queue 'q'
q.push(root);
while (f == 0) {
// count number of nodes in the
// current level
int nc = q.size();
// traverse the current level nodes
while (nc--) {
// get front element from 'q'
Node* top = q.front();
q.pop();
// if it is a leaf node
if (!top->left && !top->right) {
// accumulate data to 'sum'
sum += top->data;
// set flag 'f' to 1, to signify
// minimum level for leaf nodes
// has been encountered
f = 1;
}
else {
// if top's left and right child
// exists, then push them to 'q'
if (top->left)
q.push(top->left);
if (top->right)
q.push(top->right);
}
}
}
// required sum
return sum;
}
// Driver program to test above
int main()
{
// binary tree creation
Node* root = getNode(1);
root->left = getNode(2);
root->right = getNode(3);
root->left->left = getNode(4);
root->left->right = getNode(5);
root->right->left = getNode(6);
root->right->right = getNode(7);
root->left->right->left = getNode(8);
root->right->left->right = getNode(9);
cout << "Sum = "
<< sumOfLeafNodesAtMinLevel(root);
return 0;
}


JAVA

// Java implementation to find the sum of
// leaf nodes at minimum level
import java.util.*;
class GFG
{
// structure of a node of binary tree
static class Node
{
int data;
Node left, right;
};
// function to get a new node
static Node getNode( int data)
{
// allocate space
Node newNode = new Node();
// put in the data
newNode.data = data;
newNode.left = newNode.right = null ;
return newNode;
}
// function to find the sum of
// leaf nodes at minimum level
static int sumOfLeafNodesAtMinLevel(Node root)
{
// if tree is empty
if (root == null )
return 0 ;
// if there is only one node
if (root.left == null &&
root.right == null )
return root.data;
// queue used for level order traversal
Queue<Node> q = new LinkedList<>();
int sum = 0 ;
boolean f = false ;
// push root node in the queue 'q'
q.add(root);
while (f == false )
{
// count number of nodes in the
// current level
int nc = q.size();
// traverse the current level nodes
while (nc-- > 0 )
{
// get front element from 'q'
Node top = q.peek();
q.remove();
// if it is a leaf node
if (top.left == null &&
top.right == null )
{
// accumulate data to 'sum'
sum += top.data;
// set flag 'f' to 1, to signify
// minimum level for leaf nodes
// has been encountered
f = true ;
}
else
{
// if top's left and right child
// exists, then push them to 'q'
if (top.left != null )
q.add(top.left);
if (top.right != null )
q.add(top.right);
}
}
}
// required sum
return sum;
}
// Driver Code
public static void main(String[] args)
{
// binary tree creation
Node root = getNode( 1 );
root.left = getNode( 2 );
root.right = getNode( 3 );
root.left.left = getNode( 4 );
root.left.right = getNode( 5 );
root.right.left = getNode( 6 );
root.right.right = getNode( 7 );
root.left.right.left = getNode( 8 );
root.right.left.right = getNode( 9 );
System.out.println( "Sum = " +
sumOfLeafNodesAtMinLevel(root));
}
}
// This code is contributed by Rajput-Ji


Python3

# Python3 implementation to find the sum
# of leaf node at minimum level
from collections import deque
# Structure of a node in binary tree
class Node:
def __init__( self , data):
self .data = data
self .left = None
self .right = None
# function to find the sum of leaf nodes
# at minimum level
def sumOfLeafNodesAtLeafLevel(root):
# if tree is empty
if not root:
return 0
# if there is only root node
if not root.left and not root.right:
return root.data
# Queue used for level order traversal
Queue = deque()
sum = f = 0
# push rioot node in the queue
Queue.append(root)
while not f:
# count no. of nodes present at current level
nc = len (Queue)
# traverse current level nodes
while nc:
top = Queue.popleft()
# if node is leaf node
if not top.left and not top.right:
sum + = top.data
# set flag = 1 to signify that
# we have encountered the minimum level
f = 1
else :
# if top's left or right child exist
# push them to Queue
if top.left:
Queue.append(top.left)
if top.right:
Queue.append(top.right)
nc - = 1
# return the sum
return sum
# Driver code
if __name__ = = "__main__" :
# binary tree creation
root = Node( 1 )
root.left = Node( 2 )
root.right = Node( 3 )
root.left.left = Node( 4 )
root.left.right = Node( 5 )
root.right.left = Node( 6 )
root.right.right = Node( 7 )
root.left.right.left = Node( 8 )
root.right.left.right = Node( 9 )
print ( "Sum = " , sumOfLeafNodesAtLeafLevel(root))
# This code is contributed by
# Mayank Chaudhary (chaudhary_19)


C#

// C# implementation to find the sum of
// leaf nodes at minimum level
using System;
using System.Collections.Generic;
class GFG
{
// structure of a node of binary tree
class Node
{
public int data;
public Node left, right;
};
// function to get a new node
static Node getNode( int data)
{
// allocate space
Node newNode = new Node();
// put in the data
newNode.data = data;
newNode.left = newNode.right = null ;
return newNode;
}
// function to find the sum of
// leaf nodes at minimum level
static int sumOfLeafNodesAtMinLevel(Node root)
{
// if tree is empty
if (root == null )
return 0;
// if there is only one node
if (root.left == null &&
root.right == null )
return root.data;
// queue used for level order traversal
Queue<Node> q = new Queue<Node>();
int sum = 0;
bool f = false ;
// push root node in the queue 'q'
q.Enqueue(root);
while (f == false )
{
// count number of nodes in the
// current level
int nc = q.Count;
// traverse the current level nodes
while (nc-- >0)
{
// get front element from 'q'
Node top = q.Peek();
q.Dequeue();
// if it is a leaf node
if (top.left == null &&
top.right == null )
{
// accumulate data to 'sum'
sum += top.data;
// set flag 'f' to 1, to signify
// minimum level for leaf nodes
// has been encountered
f = true ;
}
else
{
// if top's left and right child
// exists, then push them to 'q'
if (top.left != null )
q.Enqueue(top.left);
if (top.right != null )
q.Enqueue(top.right);
}
}
}
// required sum
return sum;
}
// Driver Code
public static void Main(String[] args)
{
// binary tree creation
Node root = getNode(1);
root.left = getNode(2);
root.right = getNode(3);
root.left.left = getNode(4);
root.left.right = getNode(5);
root.right.left = getNode(6);
root.right.right = getNode(7);
root.left.right.left = getNode(8);
root.right.left.right = getNode(9);
Console.WriteLine( "Sum = " +
sumOfLeafNodesAtMinLevel(root));
}
}
// This code is contributed by PrinciRaj1992


Javascript

<script>
// JavaScript implementation to find the sum of
// leaf nodes at minimum level
class Node
{
constructor(data) {
this .left = null ;
this .right = null ;
this .data = data;
}
}
// function to get a new node
function getNode(data)
{
// allocate space
let newNode = new Node(data);
return newNode;
}
// function to find the sum of
// leaf nodes at minimum level
function sumOfLeafNodesAtMinLevel(root)
{
// if tree is empty
if (root == null )
return 0;
// if there is only one node
if (root.left == null &&
root.right == null )
return root.data;
// queue used for level order traversal
let q = [];
let sum = 0;
let f = false ;
// push root node in the queue 'q'
q.push(root);
while (f == false )
{
// count number of nodes in the
// current level
let nc = q.length;
// traverse the current level nodes
while (nc-- >0)
{
// get front element from 'q'
let top = q[0];
q.shift();
// if it is a leaf node
if (top.left == null &&
top.right == null )
{
// accumulate data to 'sum'
sum += top.data;
// set flag 'f' to 1, to signify
// minimum level for leaf nodes
// has been encountered
f = true ;
}
else
{
// if top's left and right child
// exists, then push them to 'q'
if (top.left != null )
q.push(top.left);
if (top.right != null )
q.push(top.right);
}
}
}
// required sum
return sum;
}
// binary tree creation
let root = getNode(1);
root.left = getNode(2);
root.right = getNode(3);
root.left.left = getNode(4);
root.left.right = getNode(5);
root.right.left = getNode(6);
root.right.right = getNode(7);
root.left.right.left = getNode(8);
root.right.left.right = getNode(9);
document.write( "Sum = " +
sumOfLeafNodesAtMinLevel(root));
</script>


输出

Sum = 11

时间复杂度:O(n)。 辅助空间:O(n)。

另一种使用递归的方法

这里我们将使用 穿越 二叉树的。在函数调用中,将获取根节点和级别变量,用于跟踪每个节点的级别,我们还将使用一个哈希映射,其键是我们的级别值,另一个作为存储该特定节点的节点数据的向量。 对于每个递归调用,我们都会增加level变量,如果当前节点是叶节点,那么我们会将键作为level推入一个映射,并将节点的数据推入一个向量。 一旦我们得到了地图,我们将简单地求出地图第一个元素的向量的和;

让我们看一下代码,你的所有困惑都会消失。

C++

#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
Node *left, *right;
};
// function to get a new node
Node* getNode( int data)
{
// allocate space
Node* newNode = (Node*) malloc ( sizeof (Node));
// put in the data
newNode->data = data;
newNode->left = newNode->right = NULL;
return newNode;
}
map < int , vector < int >> mp;
void solve(Node* root, int level) {
if (root == NULL)
return ;
if (root->left == NULL && root->right == NULL)
mp[level].push_back(root->data);
solve(root->left, level+1);
solve(root->right, level+1);
}
int minLeafSum(Node *root)
{
solve(root, 0);
int sum = 0;
for ( auto i:mp) {
for ( auto j:i.second) {
sum += j;
}
return sum;
}
}
int main() {
// binary tree creation
Node* root = getNode(1);
root->left = getNode(2);
root->right = getNode(3);
root->left->left = getNode(4);
root->left->right = getNode(5);
root->right->left = getNode(6);
root->right->right = getNode(7);
cout << "Sum = " << minLeafSum(root);
return 0;
}


输出

Sum = 22

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享