📌  相关文章
📜  下一个 n叉树中的较大元素

📅  最后修改于: 2022-05-13 01:57:16.464000             🧑  作者: Mango

下一个 n叉树中的较大元素

给定一个通用树和一个整数 x。在树中查找并返回具有下一个较大元素的节点,即找到一个刚好大于 x 的节点。如果不存在值大于 x 的节点,则返回 NULL。
例如,在给定的树中

x = 10,只是更大的节点值是 12

这个想法是维护一个节点指针res ,它将包含最终的结果节点。
遍历树并检查根数据是否大于 x。如果是,则将根数据与 res 数据进行比较。
如果根数据大于 n 且小于 res 数据更新 res。

C++
// CPP program to find next larger element
// in an n-ary tree.
#include 
using namespace std;
 
// Structure of a node of an n-ary tree
struct Node {
    int key;
    vector child;
};
 
// Utility function to create a new tree node
Node* newNode(int key)
{
    Node* temp = new Node;
    temp->key = key;
    return temp;
}
 
void nextLargerElementUtil(Node* root, int x, Node** res)
{
    if (root == NULL)
        return;
 
    // if root is less than res but greater than
    // x update res
    if (root->key > x)
        if (!(*res) || (*res)->key > root->key)
            *res = root;   
 
    // Number of children of root
    int numChildren = root->child.size();
 
    // Recur calling for every child
    for (int i = 0; i < numChildren; i++)
        nextLargerElementUtil(root->child[i], x, res);
 
    return;
}
 
// Function to find next Greater element of x in tree
Node* nextLargerElement(Node* root, int x)
{
    // resultant node
    Node* res = NULL;
 
    // calling helper function
    nextLargerElementUtil(root, x, &res);
 
    return res;
}
 
// Driver program
int main()
{
    /*   Let us create below tree
   *             5
   *         /   |  \
   *         1   2   3
   *        /   / \   \
   *       15  4   5   6
   */
 
    Node* root = newNode(5);
    (root->child).push_back(newNode(1));
    (root->child).push_back(newNode(2));
    (root->child).push_back(newNode(3));
    (root->child[0]->child).push_back(newNode(15));
    (root->child[1]->child).push_back(newNode(4));
    (root->child[1]->child).push_back(newNode(5));
    (root->child[2]->child).push_back(newNode(6));
 
    int x = 5;
 
    cout << "Next larger element of " << x << " is ";
    cout << nextLargerElement(root, x)->key << endl;
 
    return 0;
}


Java
// Java program to find next larger element
// in an n-ary tree.
import java.util.*;
 
class GFG
{
 
// Structure of a node of an n-ary tree
static class Node
{
    int key;
    Vector child;
};
static Node res;
 
// Utility function to create a new tree node
static Node newNode(int key)
{
    Node temp = new Node();
    temp.key = key;
    temp.child = new Vector<>();
    return temp;
}
 
static void nextLargerElementUtil(Node root, int x)
{
    if (root == null)
        return;
 
    // if root is less than res but
    // greater than x, update res
    if (root.key > x)
        if ((res == null || (res).key > root.key))
            res = root;
 
    // Number of children of root
    int numChildren = root.child.size();
 
    // Recur calling for every child
    for (int i = 0; i < numChildren; i++)
        nextLargerElementUtil(root.child.get(i), x);
 
    return;
}
 
// Function to find next Greater element
// of x in tree
static Node nextLargerElement(Node root, int x)
{
    // resultant node
    res = null;
 
    // calling helper function
    nextLargerElementUtil(root, x);
 
    return res;
}
 
// Driver Code
public static void main(String[] args)
{
    /* Let us create below tree
    *             5
    *         / | \
    *         1 2 3
    *     / / \ \
    *     15 4 5 6
    */
    Node root = newNode(5);
    (root.child).add(newNode(1));
    (root.child).add(newNode(2));
    (root.child).add(newNode(3));
    (root.child.get(0).child).add(newNode(15));
    (root.child.get(1).child).add(newNode(4));
    (root.child.get(1).child).add(newNode(5));
    (root.child.get(2).child).add(newNode(6));
 
    int x = 5;
 
    System.out.print("Next larger element of " +
                                    x + " is ");
    System.out.print(nextLargerElement(root, x).key + "\n");
 
}
}
 
// This code is contributed by 29AjayKumar


Python3
# Python program to find next larger element
# in an n-ary tree.
class Node:
  
# Structure of a node of an n-ary tree
    def __init__(self):
        self.key = 0
        self.child = []
 
# Utility function to create a new tree node
def newNode(key):
    temp = Node()
    temp.key = key
    temp.child = []
    return temp
 
res = None;   
def nextLargerElementUtil(root,x):
    global res
    if (root == None):
        return;
     
     # if root is less than res but
    # greater than x, update res
    if (root.key > x):
        if ((res == None or (res).key > root.key)):
            res = root;
             
    # Number of children of root
    numChildren = len(root.child)
     
     # Recur calling for every child
    for i in range(numChildren):
        nextLargerElementUtil(root.child[i], x)
    return
 
  # Function to find next Greater element
# of x in tree
def nextLargerElement(root,x):
   
   # resultant node
    global res
    res=None
     
    # Calling helper function
    nextLargerElementUtil(root, x)
     
    return res
     
    # Driver code
root = newNode(5)
(root.child).append(newNode(1))
(root.child).append(newNode(2))
(root.child).append(newNode(3))
(root.child[0].child).append(newNode(15))
(root.child[1].child).append(newNode(4))
(root.child[1].child).append(newNode(5))
(root.child[2].child).append(newNode(6))
 
x = 5
print("Next larger element of " , x , " is ",end='')
print(nextLargerElement(root, x).key)
 
# This code is contributed by rag2127.


C#
// C# program to find next larger element
// in an n-ary tree.
using System;
using System.Collections.Generic;
 
class GFG
{
 
// Structure of a node of an n-ary tree
class Node
{
    public int key;
    public List child;
};
static Node res;
 
// Utility function to create a new tree node
static Node newNode(int key)
{
    Node temp = new Node();
    temp.key = key;
    temp.child = new List();
    return temp;
}
 
static void nextLargerElementUtil(Node root,
                                  int x)
{
    if (root == null)
        return;
 
    // if root is less than res but
    // greater than x, update res
    if (root.key > x)
        if ((res == null ||
            (res).key > root.key))
            res = root;
 
    // Number of children of root
    int numChildren = root.child.Count;
 
    // Recur calling for every child
    for (int i = 0; i < numChildren; i++)
        nextLargerElementUtil(root.child[i], x);
 
    return;
}
 
// Function to find next Greater element
// of x in tree
static Node nextLargerElement(Node root,   
                                  int x)
{
    // resultant node
    res = null;
 
    // calling helper function
    nextLargerElementUtil(root, x);
 
    return res;
}
 
// Driver Code
public static void Main(String[] args)
{
    /* Let us create below tree
    *             5
    *         / | \
    *         1 2 3
    *     / / \ \
    *     15 4 5 6
    */
    Node root = newNode(5);
    (root.child).Add(newNode(1));
    (root.child).Add(newNode(2));
    (root.child).Add(newNode(3));
    (root.child[0].child).Add(newNode(15));
    (root.child[1].child).Add(newNode(4));
    (root.child[1].child).Add(newNode(5));
    (root.child[2].child).Add(newNode(6));
 
    int x = 5;
 
    Console.Write("Next larger element of " +
                                 x + " is ");
    Console.Write(nextLargerElement(root, x).key + "\n");
}
}
 
// This code is contributed by PrinciRaj1992


Javascript


输出:

Next larger element of 5 is 6