检查二叉树是否包含大小为2或更多的重复子树

给定一个二叉树,检查该二叉树是否包含大小为2或更大的重复子树。 注意:两个相同的叶节点不被视为一个叶节点的子树大小。

null
Input :  Binary Tree                A             /                B        C         /                      D     E       B                          /                          D    EOutput : Yes

问:谷歌采访

Tree

具有重复子树的树[以蓝色椭圆突出显示]

[方法1] 一个简单的解决方案是,我们选取树的每个节点,并试图找到给定树的任何子树是否存在于与该子树相同的树中。在这里,我们可以使用下面的帖子来查找树中其他任何地方是否存在子树。 检查一棵二叉树是否是另一棵二叉树的子树

[方法2](有效解决方案) 一种基于 树序列化 散列 。其思想是将子树序列化为字符串,并将字符串存储在哈希表中。一旦我们发现哈希表中已经存在一个序列化树(不是叶子),我们就返回true。

下面是上述想法的实施。

C++

// C++ program to find if there is a duplicate
// sub-tree of size 2 or more.
#include<bits/stdc++.h>
using namespace std;
// Separator node
const char MARKER = '$' ;
// Structure for a binary tree node
struct Node
{
char key;
Node *left, *right;
};
// A utility function to create a new node
Node* newNode( char key)
{
Node* node = new Node;
node->key = key;
node->left = node->right = NULL;
return node;
}
unordered_set<string> subtrees;
// This function returns empty string if tree
// contains a duplicate subtree of size 2 or more.
string dupSubUtil(Node *root)
{
string s = "" ;
// If current node is NULL, return marker
if (root == NULL)
return s + MARKER;
// If left subtree has a duplicate subtree.
string lStr = dupSubUtil(root->left);
if (lStr.compare(s) == 0)
return s;
// Do same for right subtree
string rStr = dupSubUtil(root->right);
if (rStr.compare(s) == 0)
return s;
// Serialize current subtree
s = s + root->key + lStr + rStr;
// If current subtree already exists in hash
// table. [Note that size of a serialized tree
// with single node is 3 as it has two marker
// nodes.
if (s.length() > 3 &&
subtrees.find(s) != subtrees.end())
return "" ;
subtrees.insert(s);
return s;
}
// Driver program to test above functions
int main()
{
Node *root = newNode( 'A' );
root->left = newNode( 'B' );
root->right = newNode( 'C' );
root->left->left = newNode( 'D' );
root->left->right = newNode( 'E' );
root->right->right = newNode( 'B' );
root->right->right->right = newNode( 'E' );
root->right->right->left= newNode( 'D' );
string str = dupSubUtil(root);
(str.compare( "" ) == 0) ? cout << " Yes " :
cout << " No " ;
return 0;
}


JAVA

// Java program to find if there is a duplicate
// sub-tree of size 2 or more.
import java.util.HashSet;
public class Main {
static char MARKER = '$' ;
// This function returns empty string if tree
// contains a duplicate subtree of size 2 or more.
public static String dupSubUtil(Node root, HashSet<String> subtrees)
{
String s = "" ;
// If current node is NULL, return marker
if (root == null )
return s + MARKER;
// If left subtree has a duplicate subtree.
String lStr = dupSubUtil(root.left,subtrees);
if (lStr.equals(s))
return s;
// Do same for right subtree
String rStr = dupSubUtil(root.right,subtrees);
if (rStr.equals(s))
return s;
// Serialize current subtree
s = s + root.data + lStr + rStr;
// If current subtree already exists in hash
// table. [Note that size of a serialized tree
// with single node is 3 as it has two marker
// nodes.
if (s.length() > 3 && subtrees.contains(s))
return "" ;
subtrees.add(s);
return s;
}
//Function to find if the Binary Tree contains duplicate
//subtrees of size 2 or more
public static String dupSub(Node root)
{
HashSet<String> subtrees= new HashSet<>();
return dupSubUtil(root,subtrees);
}
public static void main(String args[])
{
Node root = new Node( 'A' );
root.left = new Node( 'B' );
root.right = new Node( 'C' );
root.left.left = new Node( 'D' );
root.left.right = new Node( 'E' );
root.right.right = new Node( 'B' );
root.right.right.right = new Node( 'E' );
root.right.right.left= new Node( 'D' );
String str = dupSub(root);
if (str.equals( "" ))
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


Python3

# Python3 program to find if there is
# a duplicate sub-tree of size 2 or more
# Separator node
MARKER = '$'
# Structure for a binary tree node
class Node:
def __init__( self , x):
self .key = x
self .left = None
self .right = None
subtrees = {}
# This function returns empty if tree
# contains a duplicate subtree of size
# 2 or more.
def dupSubUtil(root):
global subtrees
s = ""
# If current node is None, return marker
if (root = = None ):
return s + MARKER
# If left subtree has a duplicate subtree.
lStr = dupSubUtil(root.left)
if (s in lStr):
return s
# Do same for right subtree
rStr = dupSubUtil(root.right)
if (s in rStr):
return s
# Serialize current subtree
s = s + root.key + lStr + rStr
# If current subtree already exists in hash
# table. [Note that size of a serialized tree
# with single node is 3 as it has two marker
# nodes.
if ( len (s) > 3 and s in subtrees):
return ""
subtrees[s] = 1
return s
# Driver code
if __name__ = = '__main__' :
root = Node( 'A' )
root.left = Node( 'B' )
root.right = Node( 'C' )
root.left.left = Node( 'D' )
root.left.right = Node( 'E' )
root.right.right = Node( 'B' )
root.right.right.right = Node( 'E' )
root.right.right.left = Node( 'D' )
str = dupSubUtil(root)
if "" in str :
print ( " Yes " )
else :
print ( " No " )
# This code is contributed by mohit kumar 29


C#

// C# program to find if there is a duplicate
// sub-tree of size 2 or more.
using System;
using System.Collections.Generic;
class GFG
{
static char MARKER = '$' ;
// This function returns empty string if tree
// contains a duplicate subtree of size 2 or more.
public static String dupSubUtil(Node root,
HashSet<String> subtrees)
{
String s = "" ;
// If current node is NULL, return marker
if (root == null )
return s + MARKER;
// If left subtree has a duplicate subtree.
String lStr = dupSubUtil(root.left,subtrees);
if (lStr.Equals(s))
return s;
// Do same for right subtree
String rStr = dupSubUtil(root.right,subtrees);
if (rStr.Equals(s))
return s;
// Serialize current subtree
s = s + root.data + lStr + rStr;
// If current subtree already exists in hash
// table. [Note that size of a serialized tree
// with single node is 3 as it has two marker
// nodes.
if (s.Length > 3 && subtrees.Contains(s))
return "" ;
subtrees.Add(s);
return s;
}
// Function to find if the Binary Tree contains
// duplicate subtrees of size 2 or more
public static String dupSub(Node root)
{
HashSet<String> subtrees = new HashSet<String>();
return dupSubUtil(root,subtrees);
}
// Driver code
public static void Main(String []args)
{
Node root = new Node( 'A' );
root.left = new Node( 'B' );
root.right = new Node( 'C' );
root.left.left = new Node( 'D' );
root.left.right = new Node( 'E' );
root.right.right = new Node( 'B' );
root.right.right.right = new Node( 'E' );
root.right.right.left= new Node( 'D' );
String str = dupSub(root);
if (str.Equals( "" ))
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 29AjayKumar


Javascript

<script>
// Javascript program to find if there is a duplicate
// sub-tree of size 2 or more.
let MARKER = '$' ;
// A binary tree Node has data,
// pointer to left child
// and a pointer to right child
class Node {
constructor(data)
{
this .data=data;
}
}
// This function returns empty string if tree
// contains a duplicate subtree of size 2 or more.
function dupSubUtil(root,subtrees)
{
let s = "" ;
// If current node is NULL, return marker
if (root == null )
return s + MARKER;
// If left subtree has a duplicate subtree.
let lStr = dupSubUtil(root.left,subtrees);
if (lStr==(s))
return s;
// Do same for right subtree
let rStr = dupSubUtil(root.right,subtrees);
if (rStr==(s))
return s;
// Serialize current subtree
s = s + root.data + lStr + rStr;
// If current subtree already exists in hash
// table. [Note that size of a serialized tree
// with single node is 3 as it has two marker
// nodes.
if (s.length > 3 && subtrees.has(s))
return "" ;
subtrees.add(s);
return s;
}
//Function to find if the Binary Tree contains duplicate
//subtrees of size 2 or more
function dupSub(root)
{
let subtrees= new Set();
return dupSubUtil(root,subtrees);
}
let root = new Node( 'A' );
root.left = new Node( 'B' );
root.right = new Node( 'C' );
root.left.left = new Node( 'D' );
root.left.right = new Node( 'E' );
root.right.right = new Node( 'B' );
root.right.right.right = new Node( 'E' );
root.right.right.left= new Node( 'D' );
let str = dupSub(root);
if (str==( "" ))
document.write( " Yes " );
else
document.write( " No " );
// This code is contributed by unknown2108
</script>


输出:

Yes

本文由 尼桑·辛格 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

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