检查两棵树是否相同的迭代函数
当两棵树具有相同的数据并且数据的排列也相同时,它们是相同的。要识别两棵树是否相同,我们需要同时遍历两棵树,并且在遍历时我们需要比较树的数据和子树。
例子:
Input : Roots of below trees
10 10
/ \ /
5 6 5
Output : false
Input : Roots of below trees
10 10
/ \ / \
5 6 5 6
Output : true
我们在这里讨论了递归解决方案。本文讨论了迭代解决方案。
这个想法是使用水平顺序遍历。我们同时遍历两棵树,并在我们从队列中出列和项目时比较数据。下面是这个想法的实现。
C++
/* Iterative C++ program to check if two */
#include
using namespace std;
// A Binary Tree Node
struct Node
{
int data;
struct Node *left, *right;
};
// Iterative method to find height of Binary Tree
bool areIdentical(Node *root1, Node *root2)
{
// Return true if both trees are empty
if (root1==NULL && root2==NULL) return true;
// Return false if one is empty and other is not
if (root1 == NULL) return false;
if (root2 == NULL) return false;
// Create an empty queues for simultaneous traversals
queue q1, q2;
// Enqueue Roots of trees in respective queues
q1.push(root1);
q2.push(root2);
while (!q1.empty() && !q2.empty())
{
// Get front nodes and compare them
Node *n1 = q1.front();
Node *n2 = q2.front();
if (n1->data != n2->data)
return false;
// Remove front nodes from queues
q1.pop(), q2.pop();
/* Enqueue left children of both nodes */
if (n1->left && n2->left)
{
q1.push(n1->left);
q2.push(n2->left);
}
// If one left child is empty and other is not
else if (n1->left || n2->left)
return false;
// Right child code (Similar to left child code)
if (n1->right && n2->right)
{
q1.push(n1->right);
q2.push(n2->right);
}
else if (n1->right || n2->right)
return false;
}
return true;
}
// Utility function to create a new tree node
Node* newNode(int data)
{
Node *temp = new Node;
temp->data = data;
temp->left = temp->right = NULL;
return temp;
}
// Driver program to test above functions
int main()
{
Node *root1 = newNode(1);
root1->left = newNode(2);
root1->right = newNode(3);
root1->left->left = newNode(4);
root1->left->right = newNode(5);
Node *root2 = newNode(1);
root2->left = newNode(2);
root2->right = newNode(3);
root2->left->left = newNode(4);
root2->left->right = newNode(5);
areIdentical(root1, root2)? cout << "Yes"
: cout << "No";
return 0;
}
Java
/* Iterative Java program to check if two */
import java.util.*;
class GfG {
// A Binary Tree Node
static class Node
{
int data;
Node left, right;
}
// Iterative method to find height of Binary Tree
static boolean areIdentical(Node root1, Node root2)
{
// Return true if both trees are empty
if (root1 == null && root2 == null) return true;
// Return false if one is empty and other is not
if (root1 == null || root2 == null) return false;
// Create an empty queues for simultaneous traversals
Queue q1 = new LinkedList ();
Queue q2 = new LinkedList ();
// Enqueue Roots of trees in respective queues
q1.add(root1);
q2.add(root2);
while (!q1.isEmpty() && !q2.isEmpty())
{
// Get front nodes and compare them
Node n1 = q1.peek();
Node n2 = q2.peek();
if (n1.data != n2.data)
return false;
// Remove front nodes from queues
q1.remove();
q2.remove();
/* Enqueue left children of both nodes */
if (n1.left != null && n2.left != null)
{
q1.add(n1.left);
q2.add(n2.left);
}
// If one left child is empty and other is not
else if (n1.left != null || n2.left != null)
return false;
// Right child code (Similar to left child code)
if (n1.right != null && n2.right != null)
{
q1.add(n1.right);
q2.add(n2.right);
}
else if (n1.right != null || n2.right != null)
return false;
}
return true;
}
// Utility function to create a new tree node
static Node newNode(int data)
{
Node temp = new Node();
temp.data = data;
temp.left = null;
temp.right = null;
return temp;
}
// Driver program to test above functions
public static void main(String[] args)
{
Node root1 = newNode(1);
root1.left = newNode(2);
root1.right = newNode(3);
root1.left.left = newNode(4);
root1.left.right = newNode(5);
Node root2 = newNode(1);
root2.left = newNode(2);
root2.right = newNode(3);
root2.left.left = newNode(4);
root2.left.right = newNode(5);
if(areIdentical(root1, root2) == true)
System.out.println("Yes");
else
System.out.println("No");
}
}
Python3
# Iterative Python3 program to check
# if two trees are identical
from queue import Queue
# Utility function to create a
# new tree node
class newNode:
def __init__(self, data):
self.data = data
self.left = self.right = None
# Iterative method to find height of
# Binary Tree
def areIdentical(root1, root2):
# Return true if both trees are empty
if (root1 and root2):
return True
# Return false if one is empty and
# other is not
if (root1 or root2):
return False
# Create an empty queues for
# simultaneous traversals
q1 = Queue()
q2 = Queue()
# Enqueue Roots of trees in
# respective queues
q1.put(root1)
q2.put(root2)
while (not q1.empty() and not q2.empty()):
# Get front nodes and compare them
n1 = q1.queue[0]
n2 = q2.queue[0]
if (n1.data != n2.data):
return False
# Remove front nodes from queues
q1.get()
q2.get()
# Enqueue left children of both nodes
if (n1.left and n2.left):
q1.put(n1.left)
q2.put(n2.left)
# If one left child is empty and
# other is not
elif (n1.left or n2.left):
return False
# Right child code (Similar to
# left child code)
if (n1.right and n2.right):
q1.put(n1.right)
q2.put(n2.right)
elif (n1.right or n2.right):
return False
return True
# Driver Code
if __name__ == '__main__':
root1 = newNode(1)
root1.left = newNode(2)
root1.right = newNode(3)
root1.left.left = newNode(4)
root1.left.right = newNode(5)
root2 = newNode(1)
root2.left = newNode(2)
root2.right = newNode(3)
root2.left.left = newNode(4)
root2.left.right = newNode(5)
if areIdentical(root1, root2):
print("Yes")
else:
print("No")
# This code is contributed by PranchalK
C#
/* Iterative C# program to check if two */
using System;
using System.Collections.Generic;
class GfG
{
// A Binary Tree Node
class Node
{
public int data;
public Node left, right;
}
// Iterative method to find height of Binary Tree
static bool areIdentical(Node root1, Node root2)
{
// Return true if both trees are empty
if (root1 == null && root2 == null)
return true;
// Return false if one is empty and other is not
if (root1 == null || root2 == null)
return false;
// Create an empty queues for
// simultaneous traversals
Queue q1 = new Queue ();
Queue q2 = new Queue ();
// Enqueue Roots of trees in respective queues
q1.Enqueue(root1);
q2.Enqueue(root2);
while (q1.Count != 0 && q2.Count != 0)
{
// Get front nodes and compare them
Node n1 = q1.Peek();
Node n2 = q2.Peek();
if (n1.data != n2.data)
return false;
// Remove front nodes from queues
q1.Dequeue();
q2.Dequeue();
/* Enqueue left children of both nodes */
if (n1.left != null && n2.left != null)
{
q1.Enqueue(n1.left);
q2.Enqueue(n2.left);
}
// If one left child is empty and other is not
else if (n1.left != null || n2.left != null)
return false;
// Right child code (Similar to left child code)
if (n1.right != null && n2.right != null)
{
q1.Enqueue(n1.right);
q2.Enqueue(n2.right);
}
else if (n1.right != null || n2.right != null)
return false;
}
return true;
}
// Utility function to create a new tree node
static Node newNode(int data)
{
Node temp = new Node();
temp.data = data;
temp.left = null;
temp.right = null;
return temp;
}
// Driver code
public static void Main(String[] args)
{
Node root1 = newNode(1);
root1.left = newNode(2);
root1.right = newNode(3);
root1.left.left = newNode(4);
root1.left.right = newNode(5);
Node root2 = newNode(1);
root2.left = newNode(2);
root2.right = newNode(3);
root2.left.left = newNode(4);
root2.left.right = newNode(5);
if(areIdentical(root1, root2) == true)
Console.WriteLine("Yes");
else
Console.WriteLine("No");
}
}
// This code is contributed by PrinciRaj1992
Javascript
输出:
Yes
上述解决方案的时间复杂度为 O(n + m),其中 m 和 n 是两棵树中的节点数。