Iterative Search for a key ‘x’ in Binary Tree

27 Jun, 2022
Given a Binary Tree and a key to be searched in it, write an iterative method that returns true if key is present in Binary Tree, else false.
For example, in the following tree, if the searched key is 3, then function should return true and if the searched key is 12, then function should return false.
 
One thing is sure that we need to traverse complete tree to decide whether key is present or not. We can use any of the following traversals to iteratively search a key in a given binary tree. 
Iterative Level Order Traversal. Iterative Inorder Traversal Iterative Preorder Traversal Iterative Postorder Traversal
Iterative Level Order Traversal. 
Iterative Inorder Traversal 
Iterative Preorder Traversal 
Iterative Postorder Traversal
Below is iterative Level Order Traversal based solution to search an item x in binary tree. 
Chapters
descriptions off, selected
captions settings, opens captions settings dialog
captions off, selected
English
This is a modal window.
Beginning of dialog window. Escape will cancel and close the window.
End of dialog window.
C++
C
Java
Python3
C#
Javascript
// Iterative level order traversal// based method to search in Binary Tree#include<bits/stdc++.h> using namespace std; /* A binary tree node has data,left child and right child */class node{    public:    int data;    node* left;    node* right;         /* Constructor that allocates a new node with the    given data and NULL left and right pointers. */    node(int data){        this->data = data;        this->left = NULL;        this->right = NULL;             }};  // An iterative process to search// an element x in a given binary treebool iterativeSearch(node *root, int x){    // Base Case    if (root == NULL)        return false;     // Create an empty queue for    // level order traversal    queue<node *> q;     // Enqueue Root and initialize height    q.push(root);     // Queue based level order traversal    while (q.empty() == false)    {        // See if current node is same as x        node *node = q.front();        if (node->data == x)            return true;         // Remove current node and enqueue its children        q.pop();        if (node->left != NULL)            q.push(node->left);        if (node->right != NULL)            q.push(node->right);    }     return false;} // Driver codeint main(){    node* NewRoot=NULL;    node *root = new node(2);    root->left = new node(7);    root->right = new node(5);    root->left->right = new node(6);    root->left->right->left=new node(1);    root->left->right->right=new node(11);    root->right->right=new node(9);    root->right->right->left=new node(4);     iterativeSearch(root, 6)? cout <<    "Found\n": cout << "Not Found\n";    iterativeSearch(root, 12)? cout <<    "Found\n": cout << "Not Found\n";    return 0;} // This code is contributed by rathbhupendra
// Iterative level order traversal based method to search in Binary Tree#include <iostream>#include <queue>using namespace std; /* A binary tree node has data, left child and right child */struct node{    int data;    struct node* left, *right;}; /* Helper function that allocates a new node with the given data and   NULL left and right  pointers.*/struct node* newNode(int data){    struct node* node = new struct node;    node->data = data;    node->left = node->right = NULL;    return(node);} // An iterative process to search an element x in a given binary treebool iterativeSearch(node *root, int x){    // Base Case    if (root == NULL)        return false;     // Create an empty queue for level order traversal    queue<node *> q;     // Enqueue Root and initialize height    q.push(root);     // Queue based level order traversal    while (q.empty() == false)    {        // See if current node is same as x        node *node = q.front();        if (node->data == x)            return true;         // Remove current node and enqueue its children        q.pop();        if (node->left != NULL)            q.push(node->left);        if (node->right != NULL)            q.push(node->right);    }     return false;} // Driver programint main(void){    struct node*NewRoot=NULL;    struct node *root = newNode(2);    root->left        = newNode(7);    root->right       = newNode(5);    root->left->right = newNode(6);    root->left->right->left=newNode(1);    root->left->right->right=newNode(11);    root->right->right=newNode(9);    root->right->right->left=newNode(4);     iterativeSearch(root, 6)? cout << "Found\n": cout << "Not Found\n";    iterativeSearch(root, 12)? cout << "Found\n": cout << "Not Found\n";    return 0;}
// Iterative level order traversal// based method to search in Binary Treeimport java.util.*; class GFG{     /* A binary tree node has data,left child and right child */static class node{    int data;    node left;    node right;         /* Constructor that allocates a new node with the    given data and null left and right pointers. */    node(int data)    {        this.data = data;        this.left = null;        this.right = null;             }};  // An iterative process to search// an element x in a given binary treestatic boolean iterativeSearch(node root, int x){    // Base Case    if (root == null)        return false;     // Create an empty queue for    // level order traversal    Queue<node > q = new LinkedList();     // Enqueue Root and initialize height    q.add(root);     // Queue based level order traversal    while (q.size() > 0)    {        // See if current node is same as x        node node = q.peek();        if (node.data == x)            return true;         // Remove current node and enqueue its children        q.remove();        if (node.left != null)            q.add(node.left);        if (node.right != null)            q.add(node.right);    }     return false;} // Driver codepublic static void main(String ags[]){    node NewRoot = null;    node root = new node(2);    root.left = new node(7);    root.right = new node(5);    root.left.right = new node(6);    root.left.right.left = new node(1);    root.left.right.right = new node(11);    root.right.right = new node(9);    root.right.right.left = new node(4);     System.out.print((iterativeSearch(root, 6)?    "Found\n": "Not Found\n"));    System.out.print((iterativeSearch(root, 12)?    "Found\n": "Not Found\n"));}} // This code is contributed by Arnab Kundu
# Iterative level order traversal based# method to search in Binary Tree # importing Queuefrom queue import Queue # Helper function that allocates a# new node with the given data and# None left and right pointers.class newNode:    def __init__(self, data):        self.data = data        self.left = self.right = None # An iterative process to search an# element x in a given binary treedef iterativeSearch(root, x):         # Base Case    if (root == None):        return False     # Create an empty queue for level    # order traversal    q = Queue()     # Enqueue Root and initialize height    q.put(root)     # Queue based level order traversal    while (q.empty() == False):                 # See if current node is same as x        node = q.queue[0]        if (node.data == x):            return True         # Remove current node and        # enqueue its children        q.get()        if (node.left != None):            q.put(node.left)        if (node.right != None):            q.put(node.right)     return False # Driver Codeif __name__ == '__main__':     root = newNode(2)    root.left = newNode(7)    root.right = newNode(5)    root.left.right = newNode(6)    root.left.right.left = newNode(1)    root.left.right.right = newNode(11)    root.right.right = newNode(9)    root.right.right.left = newNode(4)     if iterativeSearch(root, 6):        print("Found")    else:        print("Not Found")    if iterativeSearch(root, 12):        print("Found")    else:        print("Not Found") # This code is contributed by PranchalK
// Iterative level order traversal// based method to search in Binary Treeusing System;using System.Collections.Generic; class GFG{     /* A binary tree node has data,left child and right child */public class node{    public int data;    public node left;    public node right;         /* Constructor that allocates a new node    with the given data and null left and    right pointers. */    public node(int data)    {        this.data = data;        this.left = null;        this.right = null;    }}; // An iterative process to search// an element x in a given binary treestatic Boolean iterativeSearch(node root,                               int x){    // Base Case    if (root == null)        return false;     // Create an empty queue for    // level order traversal    Queue<node > q = new Queue<node>();     // Enqueue Root and initialize height    q.Enqueue(root);     // Queue based level order traversal    while (q.Count > 0)    {        // See if current node is same as x        node node = q.Peek();        if (node.data == x)            return true;         // Remove current node and        // enqueue its children        q.Dequeue();        if (node.left != null)            q.Enqueue(node.left);        if (node.right != null)            q.Enqueue(node.right);    }    return false;} // Driver codepublic static void Main(String []ags){    node root = new node(2);    root.left = new node(7);    root.right = new node(5);    root.left.right = new node(6);    root.left.right.left = new node(1);    root.left.right.right = new node(11);    root.right.right = new node(9);    root.right.right.left = new node(4);     Console.WriteLine((iterativeSearch(root, 6) ?                                      "Found\n" :                                   "Not Found"));    Console.Write((iterativeSearch(root, 12) ?                                   "Found\n" :                              "Not Found\n"));}} // This code is contributed by Rajput-Ji
<script>// Iterative level order traversal// based method to search in Binary Tree /* A binary tree node has data,left child and right child */class node{    constructor(data)    {        this.data = data;        this.left = null;        this.right = null;    }} // An iterative process to search// an element x in a given binary treefunction iterativeSearch(root,x){    // Base Case    if (root == null)        return false;       // Create an empty queue for    // level order traversal    let q = [];       // Enqueue Root and initialize height    q.push(root);       // Queue based level order traversal    while (q.length > 0)    {        // See if current node is same as x        let node = q[0];        if (node.data == x)            return true;           // Remove current node and enqueue its children        q.shift();        if (node.left != null)            q.push(node.left);        if (node.right != null)            q.push(node.right);    }       return false;} // Driver codelet NewRoot = null;let root = new node(2);root.left = new node(7);root.right = new node(5);root.left.right = new node(6);root.left.right.left = new node(1);root.left.right.right = new node(11);root.right.right = new node(9);root.right.right.left = new node(4); document.write((iterativeSearch(root, 6)?                  "Found<br>": "Not Found<br>"));document.write((iterativeSearch(root, 12)?                  "Found<br>": "Not Found<br>")); // This code is contributed by rag2127</script>
Found
Not Found

Below implementation uses Iterative Preorder Traversal to find x in Binary Tree 
C++
Java
Python3
C#
Javascript
// An iterative method to search an item in Binary Tree#include <iostream>#include <stack>using namespace std; /* A binary tree node has data, left child and right child */struct node{    int data;    struct node* left, *right;}; /* Helper function that allocates a new node with the given data andNULL left and right pointers.*/struct node* newNode(int data){    struct node* node = new struct node;    node->data = data;    node->left = node->right = NULL;    return(node);} // iterative process to search an element x in a given binary treebool iterativeSearch(node *root, int x){    // Base Case    if (root == NULL)        return false;     // Create an empty stack and push root to it    stack<node *> nodeStack;    nodeStack.push(root);     // Do iterative preorder traversal to search x    while (nodeStack.empty() == false)    {        // See the top item from stack and check if it is same as x        struct node *node = nodeStack.top();        if (node->data == x)            return true;        nodeStack.pop();         // Push right and left children of the popped node to stack        if (node->right)            nodeStack.push(node->right);        if (node->left)            nodeStack.push(node->left);    }     return false;} // Driver programint main(void){    struct node*NewRoot=NULL;    struct node *root = newNode(2);    root->left     = newNode(7);    root->right     = newNode(5);    root->left->right = newNode(6);    root->left->right->left=newNode(1);    root->left->right->right=newNode(11);    root->right->right=newNode(9);    root->right->right->left=newNode(4);     iterativeSearch(root, 6)? cout << "Found\n": cout << "Not Found\n";    iterativeSearch(root, 12)? cout << "Found\n": cout << "Not Found\n";    return 0;}
// An iterative method to search an item in Binary Treeimport java.util.*; class GFG{ /* A binary tree node has data,left child and right child */static class node{    int data;    node left, right;}; /* Helper function that allocates anew node with the given data andnull left and right pointers.*/static node newNode(int data){    node node = new node();    node.data = data;    node.left = node.right = null;    return(node);} // iterative process to search// an element x in a given binary treestatic boolean iterativeSearch(node root, int x){    // Base Case    if (root == null)        return false;     // Create an empty stack and push root to it    Stack<node> nodeStack = new Stack<node>();    nodeStack.push(root);     // Do iterative preorder traversal to search x    while (nodeStack.empty() == false)    {        // See the top item from stack and        // check if it is same as x        node node = nodeStack.peek();        if (node.data == x)            return true;        nodeStack.pop();         // Push right and left children        // of the popped node to stack        if (node.right != null)            nodeStack.push(node.right);        if (node.left != null)            nodeStack.push(node.left);    }    return false;} // Driver Codepublic static void main(String[] args){    node NewRoot = null;    node root = newNode(2);    root.left = newNode(7);    root.right = newNode(5);    root.left.right = newNode(6);    root.left.right.left = newNode(1);    root.left.right.right = newNode(11);    root.right.right = newNode(9);    root.right.right.left = newNode(4);     if(iterativeSearch(root, 6))        System.out.println("Found");    else        System.out.println("Not Found");    if(iterativeSearch(root, 12))        System.out.println("Found");    else        System.out.println("Not Found");}} // This code is contributed by 29AjayKumar
# An iterative Python3 code to search# an item in Binary Tree ''' A binary tree node has data,left child and right child '''class newNode:     # Construct to create a newNode    def __init__(self, key):        self.data = key        self.left = None        self.right = None # iterative process to search an element x# in a given binary treedef iterativeSearch(root,x):         # Base Case    if (root == None):        return False         # Create an empty stack and    # append root to it    nodeStack = []    nodeStack.append(root)         # Do iterative preorder traversal to search x    while (len(nodeStack)):                 # See the top item from stack and        # check if it is same as x        node = nodeStack[0]        if (node.data == x):            return True        nodeStack.pop(0)                 # append right and left children        # of the popped node to stack        if (node.right):            nodeStack.append(node.right)        if (node.left):            nodeStack.append(node.left)         return False # Driver Coderoot = newNode(2)root.left = newNode(7)root.right = newNode(5)root.left.right = newNode(6)root.left.right.left = newNode(1)root.left.right.right = newNode(11)root.right.right = newNode(9)root.right.right.left = newNode(4) if iterativeSearch(root, 6):    print("Found")else:    print("Not Found")     if iterativeSearch(root, 12):    print("Found")else:    print("Not Found") # This code is contributed by SHUBHAMSINGH10
// An iterative method to search an item in Binary Treeusing System;using System.Collections.Generic; class GFG{ /* A binary tree node has data,left child and right child */class node{    public int data;    public node left, right;}; /* Helper function that allocates anew node with the given data andnull left and right pointers.*/static node newNode(int data){    node node = new node();    node.data = data;    node.left = node.right = null;    return(node);} // iterative process to search// an element x in a given binary treestatic bool iterativeSearch(node root, int x){    // Base Case    if (root == null)        return false;     // Create an empty stack and.Push root to it    Stack<node> nodeStack = new Stack<node>();    nodeStack.Push(root);     // Do iterative preorder traversal to search x    while (nodeStack.Count != 0)    {        // See the top item from stack and        // check if it is same as x        node node = nodeStack.Peek();        if (node.data == x)            return true;        nodeStack.Pop();         // Push right and left children        // of the.Popped node to stack        if (node.right != null)            nodeStack.Push(node.right);        if (node.left != null)            nodeStack.Push(node.left);    }    return false;} // Driver Codepublic static void Main(String[] args){    node root = newNode(2);    root.left = newNode(7);    root.right = newNode(5);    root.left.right = newNode(6);    root.left.right.left = newNode(1);    root.left.right.right = newNode(11);    root.right.right = newNode(9);    root.right.right.left = newNode(4);     if(iterativeSearch(root, 6))        Console.WriteLine("Found");    else        Console.WriteLine("Not Found");    if(iterativeSearch(root, 12))        Console.WriteLine("Found");    else        Console.WriteLine("Not Found");}} // This code is contributed by PrinciRaj1992
<script>  // An iterative method to search an item in Binary Tree /* A binary tree node has data,left child and right child */class Node{  constructor()  {    this.data = 0;    this.left = null;    this.right = null;  }}; /* Helper function that allocates anew node with the given data andnull left and right pointers.*/function newNode(data){    var node = new Node();    node.data = data;    node.left = node.right = null;    return(node);} // iterative process to search// an element x in a given binary treefunction iterativeSearch(root, x){    // Base Case    if (root == null)        return false;     // Create an empty stack and.push root to it    var nodeStack = [];    nodeStack.push(root);     // Do iterative preorder traversal to search x    while (nodeStack.length != 0)    {        // See the top item from stack and        // check if it is same as x        var node = nodeStack[nodeStack.length - 1];        if (node.data == x)            return true;        nodeStack.pop();         // push right and left children        // of the.Popped node to stack        if (node.right != null)            nodeStack.push(node.right);        if (node.left != null)            nodeStack.push(node.left);    }    return false;} // Driver Codevar root = newNode(2);root.left = newNode(7);root.right = newNode(5);root.left.right = newNode(6);root.left.right.left = newNode(1);root.left.right.right = newNode(11);root.right.right = newNode(9);root.right.right.left = newNode(4);if(iterativeSearch(root, 6))    document.write("Found<br>");else    document.write("Not Found<br>");if(iterativeSearch(root, 12))    document.write("Found<br>");else    document.write("Not Found<br>"); </script>
Found
Not Found

Similarly, Iterative Inorder and Iterative Postorder traversals can be used.
PranchalKatiyar
rathbhupendra
andrew1234
Rajput-Ji
SHUBHAMSINGH10
29AjayKumar
princiraj1992
rag2127
rrrtnx
hardikkoriintern
Tree
Tree
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Introduction to Data Structures
Introduction to Tree Data Structure
What is Data Structure: Types, Classifications and Applications
Diagonal Traversal of Binary Tree
Top 50 Tree Coding Problems for Interviews
Overview of Data Structures | Set 2 (Binary Tree, BST, Heap and Hash)
Iterative Preorder Traversal
Lowest Common Ancestor in a Binary Search Tree.
Write Code to Determine if Two Trees are Identical
Boundary Traversal of binary tree