class Node:
def __init__(self, key):
self.left = None
self.right = None
self.val = key
# A utility function to insert a new node with the given key
def insert(root, key):
if root is None:
return Node(key)
if root.val == key:
return root # If the key already exists, do nothing
if root.val < key:
root.right = insert(root.right, key)
else:
root.left = insert(root.left, key)
return root
# A utility function to search for a given key in the BST
def search(root, key):
# Base cases: root is null or key is present at the root
if root is None:
return False
if root.val == key:
return True
# Key is greater than root's key
if root.val < key:
return search(root.right, key)
# Key is smaller than root's key
return search(root.left, key)
# A utility function to do inorder tree traversal
def inorder(root):
if root:
inorder(root.left)
print(root.val, end=" ")
inorder(root.right)
# A function to find the height of the tree (longest path)
def height(root):
if root is None:
return 0
# Compute the height of each subtree and take the maximum
left_height = height(root.left)
right_height = height(root.right)
return max(left_height, right_height) + 1
# Take input from the user
n = int(input("Enter the number of elements to insert into the BST: "))
root = None
for _ in range(n):
key = int(input("Enter a key to insert: "))
root = insert(root, key)
# Print inorder traversal of the BST
print("Inorder traversal of the BST:")
inorder(root)
print() # Just to add a newline after the inorder output
# Ask user for a key to search in the BST
search_key = int(input("Enter a key to search in the BST: "))
if search(root, search_key):
print(f"Key {search_key} found in the BST.")
else:
print(f"Key {search_key} not found in the BST.")
# Print the height of the tree (longest path)
print(f"The height (longest path) of the tree is: {height(root)}")