二叉树中的前三个元素
我们有一个简单的二叉树,我们必须打印二叉树中存在的前 3 个最大元素。
例子:
Input :
1
/ \
2 3
/ \ / \
4 5 4 5
Output :Three largest elements are 5 4 3
方法我们可以简单地取三个变量first、second、third分别存储第一大、第二大、第三大,并进行前序遍历,每次我们都会相应地更新元素。
这种方法只需要 O(n) 时间。
算法-
1- Take 3 variables first, second, third
2- Perform a preorder traversal
if (root==NULL)
return
if root's data is larger then first
update third with second
second with first
first with root's data
else if root's data is larger then
second and not equal to first
update third with second
second with root's data
else if root's data is larger then
third and not equal to first &
second
update third with root's data
3- call preorder for root->left
4- call preorder for root->right
C++
// CPP program to find largest three elements in
// a binary tree.
#include
using namespace std;
struct Node {
int data;
struct Node *left;
struct Node *right;
};
/* Helper function that allocates a new Node with the
given data and NULL left and right pointers. */
struct Node *newNode(int data) {
struct Node *node = new Node;
node->data = data;
node->left = NULL;
node->right = NULL;
return (node);
}
// function to find three largest element
void threelargest(Node *root, int &first, int &second,
int &third) {
if (root == NULL)
return;
// if data is greater than first large number
// update the top three list
if (root->data > first) {
third = second;
second = first;
first = root->data;
}
// if data is greater than second large number
// and not equal to first update the bottom
// two list
else if (root->data > second && root->data != first) {
third = second;
second = root->data;
}
// if data is greater than third large number
// and not equal to first & second update the
// third highest list
else if (root->data > third &&
root->data != first &&
root->data != second)
third = root->data;
threelargest(root->left, first, second, third);
threelargest(root->right, first, second, third);
}
// driver function
int main() {
struct Node *root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
root->right->left = newNode(4);
root->right->right = newNode(5);
int first = 0, second = 0, third = 0;
threelargest(root, first, second, third);
cout << "three largest elements are "
<< first << " " << second << " "
<< third;
return 0;
}
Java
// Java program to find largest three elements
// in a binary tree.
import java.util.*;
class GFG
{
static class Node
{
int data;
Node left;
Node right;
};
static int first, second, third;
/* Helper function that allocates
a new Node with the given data and
null left and right pointers. */
static Node newNode(int data)
{
Node node = new Node();
node.data = data;
node.left = null;
node.right = null;
return (node);
}
// function to find three largest element
static void threelargest(Node root)
{
if (root == null)
return;
// if data is greater than first large number
// update the top three list
if (root.data > first)
{
third = second;
second = first;
first = root.data;
}
// if data is greater than second large number
// and not equal to first update the bottom
// two list
else if (root.data > second &&
root.data != first)
{
third = second;
second = root.data;
}
// if data is greater than third large number
// and not equal to first & second update the
// third highest list
else if (root.data > third &&
root.data != first &&
root.data != second)
third = root.data;
threelargest(root.left);
threelargest(root.right);
}
// driver function
public static void main(String[] args)
{
Node root = newNode(1);
root.left = newNode(2);
root.right = newNode(3);
root.left.left = newNode(4);
root.left.right = newNode(5);
root.right.left = newNode(4);
root.right.right = newNode(5);
first = 0; second = 0; third = 0;
threelargest(root);
System.out.print("three largest elements are " +
first + " " + second + " " + third);
}
}
// This code is contributed by PrinciRaj1992
Python3
# Python3 program to find largest three
# elements in a binary tree.
# Helper function that allocates a new
# Node with the given data and None
# left and right pointers.
class newNode:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
# function to find three largest element
def threelargest(root, first, second, third):
if (root == None):
return
# if data is greater than first large
# number update the top three list
if (root.data > first[0]):
third[0] = second[0]
second[0] = first[0]
first[0] = root.data
# if data is greater than second large
# number and not equal to first update
# the bottom two list
elif (root.data > second[0] and
root.data != first[0]):
third[0] = second[0]
second[0] = root.data
# if data is greater than third large
# number and not equal to first & second
# update the third highest list
elif (root.data > third[0] and
root.data != first[0] and
root.data != second[0]):
third[0] = root.data
threelargest(root.left, first,
second, third)
threelargest(root.right, first,
second, third)
# Driver Code
if __name__ == '__main__':
root = newNode(1)
root.left = newNode(2)
root.right = newNode(3)
root.left.left = newNode(4)
root.left.right = newNode(5)
root.right.left = newNode(4)
root.right.right = newNode(5)
first = [0]
second = [0]
third = [0]
threelargest(root, first, second, third)
print("three largest elements are",
first[0], second[0], third[0])
# This code is contributed by PranchalK
C#
// C# program to find largest three elements
// in a binary tree.
using System;
class GFG
{
public class Node
{
public int data;
public Node left;
public Node right;
};
static int first, second, third;
/* Helper function that allocates
a new Node with the given data and
null left and right pointers. */
static Node newNode(int data)
{
Node node = new Node();
node.data = data;
node.left = null;
node.right = null;
return (node);
}
// function to find three largest element
static void threelargest(Node root)
{
if (root == null)
return;
// if data is greater than first large number
// update the top three list
if (root.data > first)
{
third = second;
second = first;
first = root.data;
}
// if data is greater than second large number
// and not equal to first update the bottom
// two list
else if (root.data > second &&
root.data != first)
{
third = second;
second = root.data;
}
// if data is greater than third large number
// and not equal to first & second update the
// third highest list
else if (root.data > third &&
root.data != first &&
root.data != second)
third = root.data;
threelargest(root.left);
threelargest(root.right);
}
// Driver Code
public static void Main(String[] args)
{
Node root = newNode(1);
root.left = newNode(2);
root.right = newNode(3);
root.left.left = newNode(4);
root.left.right = newNode(5);
root.right.left = newNode(4);
root.right.right = newNode(5);
first = 0; second = 0; third = 0;
threelargest(root);
Console.WriteLine("three largest elements are " +
first + " " + second + " " + third);
}
}
// This code is contributed by 29AjayKumar
Javascript
输出:
three largest elements are 5 4 3
时间复杂度: O(N)
辅助空间: O(1)