¿Comprueba si el recorrido de la hoja de dos árboles binarios es el mismo?

El recorrido de hojas es una secuencia de hojas atravesadas de izquierda a derecha. El problema es verificar si los recorridos de las hojas de dos árboles binarios dados son iguales o no.
Complejidad del tiempo esperado O(n). Espacio auxiliar esperado O(h1 + h2) donde h1 y h2 son alturas de dos árboles binarios.

Ejemplos: 

C++

// C++ code to check if leaf traversals
// of two Binary Trees are same or not.
#include <bits/stdc++.h>
using namespace std;
  
// Binary Tree Node
struct Node {
    int data;
    Node* left;
    Node* right;
};
  
// Returns new Node with data as
// input to below function.
Node* newNode(int d)
{
    Node* temp = new Node;
    temp->data = d;
    temp->left = NULL;
    temp->right = NULL;
  
    return temp;
}
  
// checks if a given node is leaf or not.
bool isLeaf(Node* root)
{
    if (root == NULL)
        return false;
    if (!root->left && !root->right)
        return true;
    return false;
}
  
// iterative function.
// returns true if leaf traversals
// are same, else false.
bool isSame(Node* root1, Node* root2)
{
    stack<Node*> s1;
    stack<Node*> s2;
  
    // push root1 to empty stack s1.
    s1.push(root1);
  
    // push root2 to empty stack s2.
    s2.push(root2);
  
    // loop until either of stacks are non-empty.
    while (!s1.empty() || !s2.empty()) 
    {
        // this means one of the stacks has
        // extra leaves, hence return false.
        if (s1.empty() || s2.empty())
            return false;
  
        Node* temp1 = s1.top();
        s1.pop();
        while (temp1 != NULL && !isLeaf(temp1))
        {
            // Push right child if exists
            if (temp1->right)
                s1.push(temp1->right);
  
            // Push left child if exists
            if (temp1->left)
                s1.push(temp1->left);
  
            // Note that right child(if exists)
            // is pushed before left child(if exists).
            temp1 = s1.top();
            s1.pop();
        }
  
        Node* temp2 = s2.top();
        s2.pop();
        while (temp2 != NULL && !isLeaf(temp2)) 
        {
            // Push right child if exists
            if (temp2->right)
                s2.push(temp2->right);
  
            // Push left child if exists
            if (temp2->left)
                s2.push(temp2->left);
            temp2 = s2.top();
            s2.pop();
        }
  
        if (!temp1 && temp2)
            return false;
        if (temp1 && !temp2)
            return false;
        if (temp1 && temp2) {
            return temp1->data == temp2->data;
        }
    }
  
    // all leaves are matched
    return true;
}
  
// Driver Code
int main()
{
    Node* root1 = newNode(1);
    root1->left = newNode(2);
    root1->right = newNode(3);
    root1->left->left = newNode(4);
    root1->right->left = newNode(6);
    root1->right->right = newNode(7);
  
    Node* root2 = newNode(0);
    root2->left = newNode(1);
    root2->right = newNode(5);
    root2->left->right = newNode(4);
    root2->right->left = newNode(6);
    root2->right->right = newNode(7);
  
    if (isSame(root1, root2))
        cout << "Same";
    else
        cout << "Not Same";
    return 0;
}
  
// This code is contributed
// by AASTHA VARMA

Java

// Java program to check if two Leaf Traversal of
// Two Binary Trees is same or not
import java.util.*;
import java.lang.*;
import java.io.*;
  
// Binary Tree node
class Node 
{
    int data;
    Node left, right;
    public Node(int x)
    {
        data = x;
        left = right = null;
    }
    public boolean isLeaf()
    {
        return (left == null && right == null);
    }
}
  
class LeafOrderTraversal
{
    // Returns true of leaf traversal of two trees is
    // same, else false
    public static boolean isSame(Node root1, Node root2)
    {
        // Create empty stacks.  These stacks are going
        // to be used for iterative traversals.
        Stack<Node> s1 = new Stack<Node>();
        Stack<Node> s2 = new Stack<Node>();
  
        s1.push(root1);
        s2.push(root2);
  
        // Loop until either of two stacks is not empty
        while (!s1.empty() || !s2.empty())
        {
            // If one of the stacks is empty means other
            // stack has extra leaves so return false
            if (s1.empty() || s2.empty())
                return false;
  
            Node temp1 = s1.pop();
            while (temp1 != null && !temp1.isLeaf()) 
            {
                // Push right and left children of temp1.
                // Note that right child is inserted
                // before left
                if (temp1.right != null)
                    s1.push(temp1.right);
                if (temp1.left != null)
                    s1.push(temp1.left);
                temp1 = s1.pop();
            }
  
            // same for tree2
            Node temp2 = s2.pop();
            while (temp2 != null && !temp2.isLeaf()) 
            {
                if (temp2.right != null)
                    s2.push(temp2.right);
                if (temp2.left != null)
                    s2.push(temp2.left);
                temp2 = s2.pop();
            }
  
            // If one is null and other is not, then
            // return false
            if (temp1 == null && temp2 != null)
                return false;
            if (temp1 != null && temp2 == null)
                return false;
  
            // If both are not null and data is not
            // same return false
            if (temp1 != null && temp2 != null) 
            {
                if (temp1.data != temp2.data)
                    return false;
            }
        }
  
        // If control reaches this point, all leaves
        // are matched
        return true;
    }
  
    // Driver code
    public static void main(String[] args)
    {
        // Let us create trees in above example 1
        Node root1 = new Node(1);
        root1.left = new Node(2);
        root1.right = new Node(3);
        root1.left.left = new Node(4);
        root1.right.left = new Node(6);
        root1.right.right = new Node(7);
  
        Node root2 = new Node(0);
        root2.left = new Node(1);
        root2.right = new Node(5);
        root2.left.right = new Node(4);
        root2.right.left = new Node(6);
        root2.right.right = new Node(7);
  
        if (isSame(root1, root2))
            System.out.println("Same");
        else
            System.out.println("Not Same");
    }
}

Python3

# Python3 program to check if two Leaf
# Traversal of Two Binary Trees is same or not
  
# Binary Tree node
  
  
class Node:
    def __init__(self, x):
        self.data = x
        self.left = self.right = None
  
    def isLeaf(self):
        return (self.left == None and
                self.right == None)
  
# Returns true of leaf traversal of
# two trees is same, else false
  
  
def isSame(root1, root2):
  
    # Create empty stacks. These stacks are going
    # to be used for iterative traversals.
    s1 = []
    s2 = []
  
    s1.append(root1)
    s2.append(root2)
  
    # Loop until either of two stacks
    # is not empty
    while (len(s1) != 0 or len(s2) != 0):
  
        # If one of the stacks is empty means other
        # stack has extra leaves so return false
        if (len(s1) == 0 or len(s2) == 0):
            return False
  
        temp1 = s1.pop(-1)
        while (temp1 != None and not temp1.isLeaf()):
  
            # append right and left children of temp1.
            # Note that right child is inserted
            # before left
            if (temp1.right != None):
                s1.append(temp1. right)
            if (temp1.left != None):
                s1.append(temp1.left)
                temp1 = s1.pop(-1)
  
        # same for tree2
        temp2 = s2.pop(-1)
        while (temp2 != None and not temp2.isLeaf()):
            if (temp2.right != None):
                s2.append(temp2.right)
            if (temp2.left != None):
                s2.append(temp2.left)
            temp2 = s2.pop(-1)
  
        # If one is None and other is not,
        # then return false
        if (temp1 == None and temp2 != None):
            return False
        if (temp1 != None and temp2 == None):
            return False
  
        # If both are not None and data is
        # not same return false
        if (temp1 != None and temp2 != None):
            if (temp1.data != temp2.data):
                return False
  
    # If control reaches this point,
    # all leaves are matched
    return True
  
  
# Driver Code
if __name__ == '__main__':
  
    # Let us create trees in above example 1
    root1 = Node(1)
    root1.left = Node(2)
    root1.right = Node(3)
    root1.left.left = Node(4)
    root1.right.left = Node(6)
    root1.right.right = Node(7)
  
    root2 = Node(0)
    root2.left = Node(1)
    root2.right = Node(5)
    root2.left.right = Node(4)
    root2.right.left = Node(6)
    root2.right.right = Node(7)
  
    if (isSame(root1, root2)):
        print("Same")
    else:
        print("Not Same")
  
# This code is contributed by pranchalK

C#

// C# program to check if two Leaf Traversal
// of Two Binary Trees is same or not
using System;
using System.Collections.Generic;
  
// Binary Tree node
public class Node {
    public int data;
    public Node left, right;
    public Node(int x)
    {
        data = x;
        left = right = null;
    }
    public virtual bool Leaf
    {
        get { 
          return (left == null && right == null); 
        }
    }
}
  
class GFG {
    // Returns true of leaf traversal of
    // two trees is same, else false
    public static bool isSame(Node root1, Node root2)
    {
        // Create empty stacks. These stacks
        // are going to be used for iterative
        // traversals.
        Stack<Node> s1 = new Stack<Node>();
        Stack<Node> s2 = new Stack<Node>();
  
        s1.Push(root1);
        s2.Push(root2);
  
        // Loop until either of two stacks
        // is not empty
        while (s1.Count > 0 || s2.Count > 0)
        {
            // If one of the stacks is empty means other
            // stack has extra leaves so return false
            if (s1.Count == 0 || s2.Count == 0)
            {
                return false;
            }
  
            Node temp1 = s1.Pop();
            while (temp1 != null && !temp1.Leaf) 
            {
                // Push right and left children of temp1.
                // Note that right child is inserted
                // before left
                if (temp1.right != null) 
                {
                    s1.Push(temp1.right);
                }
                if (temp1.left != null) 
                {
                    s1.Push(temp1.left);
                }
                temp1 = s1.Pop();
            }
  
            // same for tree2
            Node temp2 = s2.Pop();
            while (temp2 != null && !temp2.Leaf) 
            {
                if (temp2.right != null) 
                {
                    s2.Push(temp2.right);
                }
                if (temp2.left != null) 
                {
                    s2.Push(temp2.left);
                }
                temp2 = s2.Pop();
            }
  
            // If one is null and other is not,
            // then return false
            if (temp1 == null && temp2 != null) 
            {
                return false;
            }
            if (temp1 != null && temp2 == null) 
            {
                return false;
            }
  
            // If both are not null and data
            // is not same return false
            if (temp1 != null && temp2 != null) 
            {
                if (temp1.data != temp2.data) 
                {
                    return false;
                }
            }
        }
  
        // If control reaches this point,
        // all leaves are matched
        return true;
    }
  
    // Driver Code
    public static void Main(string[] args)
    {
        // Let us create trees in above example 1
        Node root1 = new Node(1);
        root1.left = new Node(2);
        root1.right = new Node(3);
        root1.left.left = new Node(4);
        root1.right.left = new Node(6);
        root1.right.right = new Node(7);
  
        Node root2 = new Node(0);
        root2.left = new Node(1);
        root2.right = new Node(5);
        root2.left.right = new Node(4);
        root2.right.left = new Node(6);
        root2.right.right = new Node(7);
  
        if (isSame(root1, root2)) {
            Console.WriteLine("Same");
        }
        else {
            Console.WriteLine("Not Same");
        }
    }
}
  
// This code is contributed by Shrikant13

Javascript

<script>
  
    // JavaScript program to check if two Leaf Traversal of
    // Two Binary Trees is same or not
      
    class Node
    {
        constructor(data) {
           this.left = null;
           this.right = null;
           this.data = data;
        }
    }
      
    // Returns true of leaf traversal of two trees is
    // same, else false
    function isSame(root1, root2)
    {
        // Create empty stacks.  These stacks are going
        // to be used for iterative traversals.
        let s1 = [];
        let s2 = [];
    
        s1.push(root1);
        s2.push(root2);
    
        // Loop until either of two stacks is not empty
        while (s1.length > 0 || s2.length > 0)
        {
            // If one of the stacks is empty means other
            // stack has extra leaves so return false
            if (s1.length == 0 || s1.length == 0)
                return false;
    
            let temp1 = s1.pop();
            while (temp1 != null && !(temp1.left == null && 
            temp1.right == null)) 
            {
                // Push right and left children of temp1.
                // Note that right child is inserted
                // before left
                if (temp1.right != null)
                    s1.push(temp1.right);
                if (temp1.left != null)
                    s1.push(temp1.left);
                temp1 = s1.pop();
            }
    
            // same for tree2
            let temp2 = s2.pop();
            while (temp2 != null && !(temp2.left == null && 
            temp2.right == null)) 
            {
                if (temp2.right != null)
                    s2.push(temp2.right);
                if (temp2.left != null)
                    s2.push(temp2.left);
                temp2 = s2.pop();
            }
    
            // If one is null and other is not, then
            // return false
            if (temp1 == null && temp2 != null)
                return false;
            if (temp1 != null && temp2 == null)
                return false;
    
            // If both are not null and data is not
            // same return false
            if (temp1 != null && temp2 != null) 
            {
                if (temp1.data != temp2.data)
                    return false;
            }
        }
    
        // If control reaches this point, all leaves
        // are matched
        return true;
    }
      
    // Let us create trees in above example 1
    let root1 = new Node(1);
    root1.left = new Node(2);
    root1.right = new Node(3);
    root1.left.left = new Node(4);
    root1.right.left = new Node(6);
    root1.right.right = new Node(7);
  
    let root2 = new Node(0);
    root2.left = new Node(1);
    root2.right = new Node(5);
    root2.left.right = new Node(4);
    root2.right.left = new Node(6);
    root2.right.right = new Node(7);
  
    if (isSame(root1, root2))
      document.write("Same");
    else
      document.write("Not Same");
      
</script>

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *