二叉树中键“x”的迭代搜索

给定一个二叉树和要在其中搜索的键,编写一个迭代方法,如果二叉树中存在键,则返回true,否则返回false。 例如,在下面的树中,如果搜索的键是3,那么函数应该返回true,如果搜索的键是12,那么函数应该返回false。

null

1T

有一点是肯定的,我们需要遍历完整的树来决定键是否存在。我们可以使用以下任何遍历来迭代搜索给定二叉树中的一个键。 1) 迭代的 水平顺序遍历 . 2) 迭代有序遍历 3) 迭代前序遍历 4) 迭代后序遍历 下面是重复的 水平顺序遍历 在二叉树中搜索项目x的基于。

C++

// 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 tree
bool 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 code
int 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" : cout << "Not Found" ;
iterativeSearch(root, 12)? cout <<
"Found" : cout << "Not Found" ;
return 0;
}
// This code is contributed by rathbhupendra


C

// 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 tree
bool 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 program
int 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" : cout << "Not Found" ;
iterativeSearch(root, 12)? cout << "Found" : cout << "Not Found" ;
return 0;
}


JAVA

// Iterative level order traversal
// based method to search in Binary Tree
import 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 tree
static 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 code
public 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" : "Not Found" ));
System.out.print((iterativeSearch(root, 12 )?
"Found" : "Not Found" ));
}
}
// This code is contributed by Arnab Kundu


Python3

# Iterative level order traversal based
# method to search in Binary Tree
# importing Queue
from 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 tree
def 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 Code
if __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


C#

// Iterative level order traversal
// based method to search in Binary Tree
using 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 tree
static 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 code
public 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" :
"Not Found" ));
Console.Write((iterativeSearch(root, 12) ?
"Found" :
"Not Found" ));
}
}
// This code is contributed by Rajput-Ji


Javascript

<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 tree
function 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 code
let 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>


输出:

FoundNot Found

下面的实现使用 迭代前序遍历 在二叉树中寻找x

C++

// 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 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);
}
// iterative process to search an element x in a given binary tree
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;
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 program
int 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" : cout << "Not Found" ;
iterativeSearch(root, 12)? cout << "Found" : cout << "Not Found" ;
return 0;
}


JAVA

// An iterative method to search an item in Binary Tree
import 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 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 = node.right = null ;
return (node);
}
// iterative process to search
// an element x in a given binary tree
static 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 Code
public 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


Python3

# 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 tree
def 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 Code
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 SHUBHAMSINGH10


C#

// An iterative method to search an item in Binary Tree
using 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 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 = node.right = null ;
return (node);
}
// iterative process to search
// an element x in a given binary tree
static 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 Code
public 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


Javascript

<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 a
new node with the given data and
null 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 tree
function 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 Code
var 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>


输出:

FoundNot Found

同样地, 迭代有序 迭代后序 可以使用遍历。

https://www.youtube.com/watch?v=-jREIGMJ8Tg

如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享