A binary search tree (BST) is a data structure that is commonly used in computer science for efficient searching, insertion, and deletion operations. A BST is a binary tree where each node has at most two child nodes, and the left child is less than the parent node, and the right child is greater than the parent node.
class TreeNode(var value: Int) {
var left: TreeNode? = null
var right: TreeNode? = null
}
The TreeNode
class represents a single node in the BST. It has a value
property, which stores the value of the node, and left
and right
properties, which are references to the left and right child nodes, respectively.
fun insert(root: TreeNode?, value: Int): TreeNode {
if (root == null) {
return TreeNode(value)
}
if (value < root.value) {
root.left = insert(root.left, value)
} else if (value > root.value) {
root.right = insert(root.right, value)
}
return root
}
The insert
function takes a root
node and a value
to insert into the BST. If the root
node is null, then we create a new TreeNode
with the given value and return it. If the value
is less than the value
of the root
node, then we recursively insert the value into the left subtree. Otherwise, we recursively insert the value into the right subtree.
To traverse a BST, we can use the following three methods:
fun inOrderTraversal(root: TreeNode?) {
if (root != null) {
inOrderTraversal(root.left)
print("${root.value} ")
inOrderTraversal(root.right)
}
}
In-order traversal: In this traversal, we visit the left subtree, then the current node, and then the right subtree.
fun preOrderTraversal(root: TreeNode?) {
if (root != null) {
print("${root.value} ")
preOrderTraversal(root.left)
preOrderTraversal(root.right)
}
}
Pre-order traversal: In this traversal, we visit the current node, then the left subtree, and then the right subtree.
fun postOrderTraversal(root: TreeNode?) {
if (root != null) {
postOrderTraversal(root.left)
postOrderTraversal(root.right)
print("${root.value} ")
}
}
Post-order traversal: In this traversal, we visit the left subtree, then the right subtree, and then the current node.
class TreeNode(var value: Int) {
var left: TreeNode? = null
var right: TreeNode? = null
}
fun insert(root: TreeNode?, value: Int): TreeNode {
if (root == null) {
return TreeNode(value)
}
if (value < root.value) {
root.left = insert(root.left, value)
} else if (value > root.value) {
root.right = insert(root.right, value)
}
return root
}
fun inOrderTraversal(root: TreeNode?) {
if (root != null) {
inOrderTraversal(root.left)
print("${root.value} ")
inOrderTraversal(root.right)
}
}
fun preOrderTraversal(root: TreeNode?) {
if (root != null) {
print("${root.value} ")
preOrderTraversal(root.left)
preOrderTraversal(root.right)
}
}
fun postOrderTraversal(root: TreeNode?) {
if (root != null) {
postOrderTraversal(root.left)
postOrderTraversal(root.right)
print("${root.value} ")
}
}
fun main() {
val root = TreeNode(5)
insert(root, 2)
insert(root, 7)
insert(root, 1)
insert(root, 3)
insert(root, 6)
insert(root, 8)
print("In-order traversal: ")
inOrderTraversal(root)
println()
print("Pre-order traversal: ")
preOrderTraversal(root)
println()
print("Post-order traversal: ")
postOrderTraversal(root)
println()
}