📜  检查二叉树(不是 BST)是否有重复值

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

检查二叉树(不是 BST)是否有重复值

检查二叉树(不是 BST)是否有重复值
例子:

Input : Root of below tree
         1
       /   \
      2     3
             \
              2
Output : Yes
Explanation : The duplicate value is 2.

Input : Root of below tree
         1
       /   \
     20     3
             \
              4
Output : No
Explanation : There are no duplicates.

一个简单的解决方案是将给定二叉树的中序遍历存储在一个数组中。然后检查数组是否有重复。我们可以避免使用数组并在 O(n) 时间内解决问题。这个想法是使用散列。我们遍历给定的树,对于每个节点,我们检查它是否已经存在于哈希表中。如果存在,我们返回 true(发现重复)。如果它不存在,我们插入到哈希表中。

C++
// C++ Program to check duplicates
// in Binary Tree
#include 
using namespace std;
 
// A binary tree Node has data,
// pointer to left child
// and a pointer to right child
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 = node->right = NULL;
    return (node);
}
 
bool checkDupUtil(Node* root, unordered_set &s)
{
    // If tree is empty, there are no
    // duplicates.
    if (root == NULL)
       return false;
 
    // If current node's data is already present.
    if (s.find(root->data) != s.end())
       return true;
 
    // Insert current node
    s.insert(root->data);
     
    // Recursively check in left and right
    // subtrees.
    return checkDupUtil(root->left, s) ||
           checkDupUtil(root->right, s);
}
 
// To check if tree has duplicates
bool checkDup(struct Node* root)
{
    unordered_set s;
    return checkDupUtil(root, s);
}
 
// Driver program to test above functions
int main()
{
    struct Node* root = newNode(1);
    root->left = newNode(2);
    root->right = newNode(2);
    root->left->left = newNode(3);
    if (checkDup(root))
        printf("Yes");
    else
        printf("No");
 
    return 0;
}


Java
// Java Program to check duplicates
// in Binary Tree
import java.util.HashSet;
public class CheckDuplicateValues {
 
    //Function that used HashSet to find presence of duplicate nodes
    public static boolean checkDupUtil(Node root, HashSet s)
    {
        // If tree is empty, there are no
        // duplicates. 
        if (root == null)
            return false;
   
        // If current node's data is already present.
        if (s.contains(root.data))
            return true;
   
        // Insert current node
        s.add(root.data);
       
        // Recursively check in left and right
        // subtrees.
        return checkDupUtil(root.left, s) || checkDupUtil(root.right, s);
    }
   
    // To check if tree has duplicates
    public static boolean checkDup(Node root)
    {
        HashSet s=new HashSet<>();
        return checkDupUtil(root, s);
    }
 
    public static void main(String args[]) {
        Node root = new Node(1);
        root.left = new Node(2);
        root.right = new Node(2);
        root.left.left = new Node(3);
        if (checkDup(root))
            System.out.print("Yes");
        else
            System.out.print("No");
    }
}
 
// A binary tree Node has data,
// pointer to left child
// and a pointer to right child
class Node {
    int data;
    Node left,right;
    Node(int data)
    {
        this.data=data;
    }
};
//This code is contributed by Gaurav Tiwari


Python
""" Program to check duplicates
# in Binary Tree """
 
# Helper function that allocates a new
# node with the given data and None
# left and right pointers.                                
class newNode:
 
    # Construct to create a new node
    def __init__(self, key):
        self.data = key
        self.left = None
        self.right = None
 
def checkDupUtil( root, s) :
 
    # If tree is empty, there are no
    # duplicates.
    if (root == None) :
        return False
 
    # If current node's data is already present.
    if root.data in s:
        return True
 
    # Insert current node
    s.add(root.data)
     
    # Recursively check in left and right
    # subtrees.
    return checkDupUtil(root.left, s) or checkDupUtil(root.right, s)
 
 
# To check if tree has duplicates
def checkDup( root) :
 
    s=set()
    return checkDupUtil(root, s)
 
 
# Driver Code
if __name__ == '__main__':
    root = newNode(1)
    root.left = newNode(2)
    root.right = newNode(2)
    root.left.left = newNode(3)
    if (checkDup(root)):
        print("Yes")
    else:
        print("No")
 
# This code is contributed by
# Shubham Singh(SHUBHAMSINGH10)


C#
// C# Program to check duplicates
// in Binary Tree
using System;
using System.Collections;
using System.Collections.Generic;
 
class CheckDuplicateValues
{
 
    //Function that used HashSet to
    // find presence of duplicate nodes
    public static Boolean checkDupUtil(Node root, HashSet s)
    {
        // If tree is empty, there are no
        // duplicates.
        if (root == null)
            return false;
     
        // If current node's data is already present.
        if (s.Contains(root.data))
            return true;
     
        // Insert current node
        s.Add(root.data);
         
        // Recursively check in left and right
        // subtrees.
        return checkDupUtil(root.left, s) ||
                checkDupUtil(root.right, s);
    }
     
    // To check if tree has duplicates
    public static Boolean checkDup(Node root)
    {
        HashSet s = new HashSet();
        return checkDupUtil(root, s);
    }
 
    public static void Main(String []args)
    {
        Node root = new Node(1);
        root.left = new Node(2);
        root.right = new Node(2);
        root.left.left = new Node(3);
        if (checkDup(root))
            Console.Write("Yes");
        else
            Console.Write("No");
    }
}
 
// A binary tree Node has data,
// pointer to left child
// and a pointer to right child
public class Node
{
    public int data;
    public Node left, right;
    public Node(int data)
    {
        this.data = data;
    }
};
 
// This code is contributed by Arnab Kundu


Javascript


输出:

Yes

?list=PLqM7alHXFySHCXD7r1J0ky9Zg_GBB1dbk