📌  相关文章
📜  检查两棵树是否具有相同的结构

📅  最后修改于: 2021-06-29 10:52:24             🧑  作者: Mango

给定两个二叉树。任务是编写一个程序来检查两个树的结构是否相同。

在上图中,两个树Tree1和Tree2的结构相同。也就是说,它们具有相同的结构。
注意:此问题不同于检查两个树是否相同,因为在这里我们只需要比较两个树的结构,而不是它们节点上的值。

这个想法是沿着相同的路径同时遍历两个树,并继续检查两个树是否都存在一个节点。
算法

  1. 如果两棵树都为空,则返回1。
  2. 否则,如果两棵树都不为空:
    • 递归检查左子树,即调用isSameStructure(tree1-> left_subtree,tree2-> left_subtree)
    • 递归检查右子树,即调用isSameStructure(tree1-> right_subtree,tree2-> right_subtree)
    • 如果以上两个步骤返回的值为true,则返回1。
  3. 否则返回0(一个为空,另一个不为空)。

下面是上述算法的实现:

C++
// C++ program to check if two trees have
// same structure
#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.
Node* newNode(int data)
{
    Node* node = new Node;
    node->data = data;
    node->left = NULL;
    node->right = NULL;
 
    return(node);
}
 
// Function to check if two trees have same
// structure
int isSameStructure(Node* a, Node* b)
{
    // 1. both empty
    if (a==NULL && b==NULL)
        return 1;
 
    // 2. both non-empty -> compare them
    if (a!=NULL && b!=NULL)
    {
        return
        (
            isSameStructure(a->left, b->left) &&
            isSameStructure(a->right, b->right)
        );
    }
     
    // 3. one empty, one not -> false
    return 0;
}
 
// Driver code
int main()
{
    Node *root1 = newNode(10);
    Node *root2 = newNode(100);
    root1->left = newNode(7);
    root1->right = newNode(15);
    root1->left->left = newNode(4);
    root1->left->right = newNode(9);
    root1->right->right = newNode(20);
 
    root2->left = newNode(70);
    root2->right = newNode(150);
    root2->left->left = newNode(40);
    root2->left->right = newNode(90);
    root2->right->right = newNode(200);
 
    if (isSameStructure(root1, root2))
        printf("Both trees have same structure");
    else
        printf("Trees do not have same structure");
 
    return 0;
}


Java
// Java program to check if two trees have
// same structure
class GFG
{
     
// A binary tree node has data,
// pointer to left child and
// a pointer to right child
static class Node
{
    int data;
    Node left;
    Node right;
};
 
// 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 check if two trees
// have same structure
static boolean isSameStructure(Node a, Node b)
{
    // 1. both empty
    if (a == null && b == null)
        return true;
 
    // 2. both non-empty . compare them
    if (a != null && b != null)
    {
        return
        (
            isSameStructure(a.left, b.left) &&
            isSameStructure(a.right, b.right)
        );
    }
     
    // 3. one empty, one not . false
    return false;
}
 
// Driver code
public static void main(String args[])
{
    Node root1 = newNode(10);
    Node root2 = newNode(100);
    root1.left = newNode(7);
    root1.right = newNode(15);
    root1.left.left = newNode(4);
    root1.left.right = newNode(9);
    root1.right.right = newNode(20);
 
    root2.left = newNode(70);
    root2.right = newNode(150);
    root2.left.left = newNode(40);
    root2.left.right = newNode(90);
    root2.right.right = newNode(200);
 
    if (isSameStructure(root1, root2))
        System.out.printf("Both trees have same structure");
    else
        System.out.printf("Trees do not have same structure");
}
}
 
// This code is contributed by Arnab Kundu


Python3
# Python3 program to check if two trees have
# same structure
  
# A binary tree node has data, pointer to left child
# and a pointer to right child
class Node:
     
    def __init__(self, data):
         
        self.left = None
        self.right = None
        self.data = data
 
# Helper function that allocates a new node with the
# given data and None left and right pointers.
def newNode(data):
     
    node = Node(data)
    return node
     
# Function to check if two trees have same
# structure
def isSameStructure(a, b):
 
    # 1. both empty
    if (a == None and b == None):
        return 1;
  
    # 2. both non-empty . compare them
    if (a != None and b != None):
     
        return (
            isSameStructure(a.left, b.left) and
            isSameStructure(a.right, b.right))
         
    # 3. one empty, one not . false
    return 0;
  
# Driver code
if __name__=='__main__':
     
    root1 = newNode(10);
    root2 = newNode(100);
    root1.left = newNode(7);
    root1.right = newNode(15);
    root1.left.left = newNode(4);
    root1.left.right = newNode(9);
    root1.right.right = newNode(20);
  
    root2.left = newNode(70);
    root2.right = newNode(150);
    root2.left.left = newNode(40);
    root2.left.right = newNode(90);
    root2.right.right = newNode(200);
  
    if (isSameStructure(root1, root2)):
        print("Both trees have same structure");
    else:
        print("Trees do not have same structure");
  
# This code is contributed by rutvik_56


C#
// C# program to check if two trees
// have same structure
using System;
 
class GFG
{
     
// 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;
    public Node right;
};
 
// 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 check if two trees
// have same structure
static Boolean isSameStructure(Node a,
                               Node b)
{
    // 1. both empty
    if (a == null && b == null)
        return true;
 
    // 2. both non-empty . compare them
    if (a != null && b != null)
    {
        return
        (
            isSameStructure(a.left, b.left) &&
            isSameStructure(a.right, b.right)
        );
    }
     
    // 3. one empty, one not . false
    return false;
}
 
// Driver code
public static void Main(String []args)
{
    Node root1 = newNode(10);
    Node root2 = newNode(100);
    root1.left = newNode(7);
    root1.right = newNode(15);
    root1.left.left = newNode(4);
    root1.left.right = newNode(9);
    root1.right.right = newNode(20);
 
    root2.left = newNode(70);
    root2.right = newNode(150);
    root2.left.left = newNode(40);
    root2.left.right = newNode(90);
    root2.right.right = newNode(200);
 
    if (isSameStructure(root1, root2))
        Console.Write("Both trees have " + 
                      "same structure");
    else
        Console.Write("Trees do not have" +
                      " same structure");
}
}
 
// This code is contributed by Rajput-Ji


输出:
Both trees have same structure