Comprobar el árbol binario simétrico (enfoque iterativo)

Dado un árbol binario, compruebe si es un espejo de sí mismo sin recursividad.

Ejemplos: 

C++

// C++ program to check if a given Binary
// Tree is symmetric or not
#include<bits/stdc++.h>
using namespace std;
 
// A Binary Tree Node
struct Node
{
    int key;
    struct Node* left, *right;
};
 
// Utility function to create new Node
Node *newNode(int key)
{
    Node *temp = new Node;
    temp->key = key;
    temp->left = temp->right = NULL;
    return (temp);
}
 
// Returns true if a tree is symmetric
// i.e. mirror image of itself
bool isSymmetric(struct Node* root)
{
    if(root == NULL)
        return true;
     
    // If it is a single tree node, then
    // it is a symmetric tree.
    if(!root->left && !root->right)
        return true;
     
    queue <Node*> q;
     
    // Add root to queue two times so that
    // it can be checked if either one child
    // alone is NULL or not.
    q.push(root);
    q.push(root);
     
    // To store two nodes for checking their
    // symmetry.
    Node* leftNode, *rightNode;
     
    while(!q.empty()){
         
        // Remove first two nodes to check
        // their symmetry.
        leftNode = q.front();
        q.pop();
         
        rightNode = q.front();
        q.pop();
         
        // if both left and right nodes
        // exist, but have different
        // values--> inequality, return false
        if(leftNode->key != rightNode->key){
        return false;
        }
         
        // Push left child of left subtree node
        // and right child of right subtree
        // node in queue.
        if(leftNode->left && rightNode->right){
            q.push(leftNode->left);
            q.push(rightNode->right);
        }
         
        // If only one child is present alone
        // and other is NULL, then tree
        // is not symmetric.
        else if (leftNode->left || rightNode->right)
        return false;
         
        // Push right child of left subtree node
        // and left child of right subtree node
        // in queue.
        if(leftNode->right && rightNode->left){
            q.push(leftNode->right);
            q.push(rightNode->left);
        }
         
        // If only one child is present alone
        // and other is NULL, then tree
        // is not symmetric.
        else if(leftNode->right || rightNode->left)
        return false;
    }
     
    return true;
}
 
// Driver program
int main()
{
    // Let us construct the Tree shown in
    // the above figure
    Node *root = newNode(1);
    root->left = newNode(2);
    root->right = newNode(2);
    root->left->left = newNode(3);
    root->left->right = newNode(4);
    root->right->left = newNode(4);
    root->right->right = newNode(3);
 
    if(isSymmetric(root))
        cout << "The given tree is Symmetric";
    else
        cout << "The given tree is not Symmetric";
    return 0;
}
 
// This code is contributed by Nikhil jindal.

Java

// Iterative Java program to check if
// given binary tree symmetric
import java.util.* ;
 
public class BinaryTree
{
    Node root;
    static class Node
    {
        int val;
        Node left, right;
        Node(int v)
        {
            val = v;
            left = null;
            right = null;
        }
    }
 
    /* constructor to initialise the root */
    BinaryTree(Node r) { root = r; }
 
    /* empty constructor */
    BinaryTree()  {  }
 
 
    /* function to check if the tree is Symmetric */
    public boolean isSymmetric(Node root)
    {
        /* This allows adding null elements to the queue */
        Queue<Node> q = new LinkedList<Node>();
 
        /* Initially, add left and right nodes of root */
        q.add(root.left);
        q.add(root.right);
 
        while (!q.isEmpty())
        {
            /* remove the front 2 nodes to
              check for equality */
            Node tempLeft = q.remove();
            Node tempRight = q.remove();
 
            /* if both are null, continue and check
               for further elements */
            if (tempLeft==null && tempRight==null)
                continue;
 
            /* if only one is null---inequality, return false */
            if ((tempLeft==null && tempRight!=null) ||
                (tempLeft!=null && tempRight==null))
                return false;
 
            /* if both left and right nodes exist, but
               have different values-- inequality,
               return false*/
            if (tempLeft.val != tempRight.val)
                return false;
 
            /* Note the order of insertion of elements
               to the queue :
               1) left child of left subtree
               2) right child of right subtree
               3) right child of left subtree
               4) left child of right subtree */
            q.add(tempLeft.left);
            q.add(tempRight.right);
            q.add(tempLeft.right);
            q.add(tempRight.left);
        }
 
        /* if the flow reaches here, return true*/
        return true;
    }
 
    /* driver function to test other functions */
    public static void main(String[] args)
    {
        Node n = new Node(1);
        BinaryTree bt = new BinaryTree(n);
        bt.root.left = new Node(2);
        bt.root.right = new Node(2);
        bt.root.left.left = new Node(3);
        bt.root.left.right = new Node(4);
        bt.root.right.left = new Node(4);
        bt.root.right.right = new Node(3);
 
        if (bt.isSymmetric(bt.root))
            System.out.println("The given tree is Symmetric");
        else
            System.out.println("The given tree is not Symmetric");
    }
}

Python3

# Python3 program to program to check if a
# given Binary Tree is symmetric or not
 
# Helper function that allocates a new
# node with the given data and None
# left and right pairs.                                    
class newNode:
 
    # Constructor to create a new node
    def __init__(self, key):
        self.key = key
        self.left = None
        self.right = None
 
# function to check if a given
# Binary Tree is symmetric or not
def isSymmetric( root) :
 
    # if tree is empty
    if (root == None) :
        return True
     
    # If it is a single tree node,
    # then it is a symmetric tree.
    if(not root.left and not root.right):
        return True
     
    q = []    
     
    # Add root to queue two times so that
    # it can be checked if either one
    # child alone is NULL or not.
    q.append(root)
    q.append(root)
     
    # To store two nodes for checking
    # their symmetry.
    leftNode = 0
    rightNode = 0
     
    while(not len(q)):
         
        # Remove first two nodes to
        # check their symmetry.
        leftNode = q[0]
        q.pop(0)
         
        rightNode = q[0]
        q.pop(0)
         
        # if both left and right nodes
        # exist, but have different
        # values-. inequality, return False
        if(leftNode.key != rightNode.key):
            return False
         
        # append left child of left subtree
        # node and right child of right 
        # subtree node in queue.
        if(leftNode.left and rightNode.right) :
            q.append(leftNode.left)
            q.append(rightNode.right)
         
        # If only one child is present
        # alone and other is NULL, then
        # tree is not symmetric.
        elif (leftNode.left or rightNode.right) :
            return False
         
        # append right child of left subtree
        # node and left child of right subtree
        # node in queue.
        if(leftNode.right and rightNode.left):
            q.append(leftNode.right)
            q.append(rightNode.left)
         
        # If only one child is present
        # alone and other is NULL, then
        # tree is not symmetric.
        elif(leftNode.right or rightNode.left):
            return False
     
    return True
         
# Driver Code
if __name__ == '__main__':
     
    # Let us construct the Tree
    # shown in the above figure
    root = newNode(1)
    root.left = newNode(2)
    root.right = newNode(2)
    root.left.left = newNode(3)
    root.left.right = newNode(4)
    root.right.left = newNode(4)
    root.right.right = newNode(3)
    if (isSymmetric(root)) :
        print("The given tree is Symmetric")
    else:
        print("The given tree is not Symmetric")
 
# This code is contributed by
# Shubham Singh(SHUBHAMSINGH10)

C#

// Iterative C# program to check if
// given binary tree symmetric
using System;
using System.Collections.Generic;
 
public class BinaryTree
{
    public Node root;
    public class Node
    {
        public int val;
        public Node left, right;
        public Node(int v)
        {
            val = v;
            left = null;
            right = null;
        }
    }
 
    /* constructor to initialise the root */
    BinaryTree(Node r) { root = r; }
 
    /* empty constructor */
    BinaryTree() { }
 
 
    /* function to check if the tree is Symmetric */
    public bool isSymmetric(Node root)
    {
        /* This allows adding null elements to the queue */
        Queue<Node> q = new Queue<Node>();
 
        /* Initially, add left and right nodes of root */
        q.Enqueue(root.left);
        q.Enqueue(root.right);
 
        while (q.Count!=0)
        {
            /* remove the front 2 nodes to
            check for equality */
            Node tempLeft = q.Dequeue();
            Node tempRight = q.Dequeue();
 
            /* if both are null, continue and check
            for further elements */
            if (tempLeft==null && tempRight==null)
                continue;
 
            /* if only one is null---inequality, return false */
            if ((tempLeft==null && tempRight!=null) ||
                (tempLeft!=null && tempRight==null))
                return false;
 
            /* if both left and right nodes exist, but
            have different values-- inequality,
            return false*/
            if (tempLeft.val != tempRight.val)
                return false;
 
            /* Note the order of insertion of elements
            to the queue :
            1) left child of left subtree
            2) right child of right subtree
            3) right child of left subtree
            4) left child of right subtree */
            q.Enqueue(tempLeft.left);
            q.Enqueue(tempRight.right);
            q.Enqueue(tempLeft.right);
            q.Enqueue(tempRight.left);
        }
 
        /* if the flow reaches here, return true*/
        return true;
    }
 
    /* driver code */
    public static void Main(String[] args)
    {
        Node n = new Node(1);
        BinaryTree bt = new BinaryTree(n);
        bt.root.left = new Node(2);
        bt.root.right = new Node(2);
        bt.root.left.left = new Node(3);
        bt.root.left.right = new Node(4);
        bt.root.right.left = new Node(4);
        bt.root.right.right = new Node(3);
 
        if (bt.isSymmetric(bt.root))
            Console.WriteLine("The given tree is Symmetric");
        else
            Console.WriteLine("The given tree is not Symmetric");
    }
}
 
// This code is contributed by PrinciRaj1992

Javascript

<script>
  
// Iterative Javascript program to check if
// given binary tree symmetric
var root = null;
 
class Node
{
    constructor(v)
    {
        this.val = v;
        this.left = null;
        this.right = null;
    }
}
 
/* Function to check if the tree is Symmetric */
function isSymmetric(root)
{
     
    /* This allows adding null
    elements to the queue */
    var q = [];
     
    /* Initially, add left and
    right nodes of root */
    q.push(root.left);
    q.push(root.right);
     
    while (q.length != 0)
    {
         
        /* Remove the front 2 nodes to
        check for equality */
        var tempLeft = q[0];
        q.shift();
        var tempRight = q[0];
        q.shift();
         
        /* If both are null, continue and check
        for further elements */
        if (tempLeft == null && tempRight == null)
            continue;
             
        /* If only one is null---inequality, return false */
        if ((tempLeft == null && tempRight != null) ||
            (tempLeft != null && tempRight == null))
            return false;
             
        /* If both left and right nodes exist, but
        have different values-- inequality,
        return false*/
        if (tempLeft.val != tempRight.val)
            return false;
             
        /* Note the order of insertion of elements
        to the queue :
        1) left child of left subtree
        2) right child of right subtree
        3) right child of left subtree
        4) left child of right subtree */
        q.push(tempLeft.left);
        q.push(tempRight.right);
        q.push(tempLeft.right);
        q.push(tempRight.left);
    }
     
    /* If the flow reaches here, return true*/
    return true;
}
 
// Driver code
var n = new Node(1);
root = n;
root.left = new Node(2);
root.right = new Node(2);
root.left.left = new Node(3);
root.left.right = new Node(4);
root.right.left = new Node(4);
root.right.right = new Node(3);
 
if (isSymmetric(root))
    document.write("The given tree is Symmetric");
else
    document.write("The given tree is not Symmetric");
 
// This code is contributed by noob2000
 
</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 *