Для заданного двоичного дерева и целочисленного значения K задача состоит в том, чтобы найти все узлы в данном двоичном дереве, имеющие K листьев в поддереве с корнями в них.

Примеры :
// For above binary tree
Input : k = 2
Output: {3}
// here node 3 have k = 2 leaves
Input : k = 1
Output: {6}
// here node 6 have k = 1 leave
Здесь любой узел, имеющий K листьев, означает, что сумма листьев в левом поддереве и в правом поддереве должна быть равна K. Поэтому для решения этой проблемы мы используем обход дерева Postorder. Сначала мы вычисляем листья в левом поддереве, затем в правом поддереве и, если сумма равна K, то выводим текущий узел. В каждом рекурсивном вызове мы возвращаем сумму предков левого поддерева и правого поддерева.
Ниже приведена реализация вышеуказанного подхода:
C ++
#include<bits/stdc++.h>
using namespace std;
struct Node
{
int data ;
struct Node * left, * right ;
};
struct Node * newNode( int data)
{
struct Node * node = new Node;
node->data = data;
node->left = node->right = NULL;
return (node);
}
int kLeaves( struct Node *ptr, int k)
{
if (ptr == NULL)
return 0;
if (ptr->left == NULL && ptr->right == NULL)
return 1;
int total = kLeaves(ptr->left, k) +
kLeaves(ptr->right, k);
if (k == total)
cout << ptr->data << " " ;
return total;
}
int main()
{
struct Node *root = newNode(1);
root->left = newNode(2);
root->right = newNode(4);
root->left->left = newNode(5);
root->left->right = newNode(6);
root->left->left->left = newNode(9);
root->left->left->right = newNode(10);
root->right->right = newNode(8);
root->right->left = newNode(7);
root->right->left->left = newNode(11);
root->right->left->right = newNode(12);
kLeaves(root, 2);
return 0;
}
|
Джава
class GfG {
static class Node
{
int data ;
Node left, right ;
Node( int data)
{
this .data = data;
}
Node()
{
}
}
static Node newNode( int data)
{
Node node = new Node();
node.data = data;
node.left = null ;
node.right = null ;
return (node);
}
static int kLeaves(Node ptr, int k)
{
if (ptr == null )
return 0 ;
if (ptr.left == null && ptr.right == null )
return 1 ;
int total = kLeaves(ptr.left, k) + kLeaves(ptr.right, k);
if (k == total)
System.out.print(ptr.data + " " );
return total;
}
public static void main(String[] args)
{
Node root = newNode( 1 );
root.left = newNode( 2 );
root.right = newNode( 4 );
root.left.left = newNode( 5 );
root.left.right = newNode( 6 );
root.left.left.left = newNode( 9 );
root.left.left.right = newNode( 10 );
root.right.right = newNode( 8 );
root.right.left = newNode( 7 );
root.right.left.left = newNode( 11 );
root.right.left.right = newNode( 12 );
kLeaves(root, 2 );
} }
|
python3
class newNode:
def __init__( self , data):
self .data = data
self .left = None
self .right = None
def kLeaves(ptr, k):
if (ptr = = None ):
return 0
if (ptr.left = = None and
ptr.right = = None ):
return 1
total = kLeaves(ptr.left, k) + \
kLeaves(ptr.right, k)
if (k = = total):
print (ptr.data, end = " " )
return total
root = newNode( 1 )
root.left = newNode( 2 )
root.right = newNode( 4 )
root.left.left = newNode( 5 )
root.left.right = newNode( 6 )
root.left.left.left = newNode( 9 )
root.left.left.right = newNode( 10 )
root.right.right = newNode( 8 )
root.right.left = newNode( 7 )
root.right.left.left = newNode( 11 )
root.right.left.right = newNode( 12 )
kLeaves(root, 2 )
|
C #
using System;
class GfG
{
public class Node
{
public int data ;
public Node left, right ;
public Node( int data)
{
this .data = data;
}
public Node()
{
}
}
static Node newNode( int data)
{
Node node = new Node();
node.data = data;
node.left = null ;
node.right = null ;
return (node);
}
static int kLeaves(Node ptr, int k)
{
if (ptr == null )
return 0;
if (ptr.left == null && ptr.right == null )
return 1;
int total = kLeaves(ptr.left, k) + kLeaves(ptr.right, k);
if (k == total)
Console.Write(ptr.data + " " );
return total;
}
public static void Main(String[] args)
{
Node root = newNode(1);
root.left = newNode(2);
root.right = newNode(4);
root.left.left = newNode(5);
root.left.right = newNode(6);
root.left.left.left = newNode(9);
root.left.left.right = newNode(10);
root.right.right = newNode(8);
root.right.left = newNode(7);
root.right.left.left = newNode(11);
root.right.left.right = newNode(12);
kLeaves(root, 2);
} }
|
Выход:
5 7
Временная сложность: O (n)
Эта статья предоставлена Шашанком Мишрой (Гуллу) . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
Вывести все узлы в двоичном дереве с K листьями
0.00 (0%) 0 votes