|
|
// ====================================================
|
|
|
// Data-Structures-with-Go Copyright(C) 2017 Furkan Türkal
|
|
|
// This program comes with ABSOLUTELY NO WARRANTY; This is free software,
|
|
|
// and you are welcome to redistribute it under certain conditions; See
|
|
|
// file LICENSE, which is part of this source code package, for details.
|
|
|
// ====================================================
|
|
|
|
|
|
package main
|
|
|
|
|
|
import "fmt"
|
|
|
|
|
|
type Node struct {
|
|
|
data int
|
|
|
left *Node
|
|
|
right *Node
|
|
|
}
|
|
|
|
|
|
//Returns an initialized list
|
|
|
func (n *Node) Init(data int) *Node {
|
|
|
n.data = data
|
|
|
n.left = nil
|
|
|
n.right = nil
|
|
|
return n
|
|
|
}
|
|
|
|
|
|
//Returns an new list
|
|
|
func New(data int) *Node {
|
|
|
return new(Node).Init(data)
|
|
|
}
|
|
|
|
|
|
//Function to search a given key in a given BST
|
|
|
func Search(root *Node, key int) *Node {
|
|
|
//1. Base Cases: root is null or key is present at root
|
|
|
if root == nil || root.data == key {
|
|
|
//fmt.Println("The given previous node cannot be NULL")
|
|
|
return root
|
|
|
}
|
|
|
|
|
|
//2. Key is greater than root's key
|
|
|
if root.data < key {
|
|
|
return Search(root.right, key)
|
|
|
}
|
|
|
|
|
|
//3. Key is smaller than root's key
|
|
|
return Search(root.left, key)
|
|
|
}
|
|
|
|
|
|
//A utility function to do inorder traversal of BST
|
|
|
func PrintInOrder(root *Node) {
|
|
|
if root != nil {
|
|
|
PrintInOrder(root.left)
|
|
|
fmt.Printf("%d \n", root.data)
|
|
|
PrintInOrder(root.right)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//A utility function to insert a new node with given key in BST
|
|
|
func Insert(node *Node, key int) *Node {
|
|
|
//1. If the tree is empty, return a new node
|
|
|
if node == nil {
|
|
|
return New(key)
|
|
|
}
|
|
|
|
|
|
//2. Otherwise, recur down the tree
|
|
|
if key < node.data {
|
|
|
node.left = Insert(node.left, key)
|
|
|
} else if key > node.data {
|
|
|
node.right = Insert(node.right, key)
|
|
|
}
|
|
|
|
|
|
//3. Return the (unchanged) node pointer
|
|
|
return node
|
|
|
}
|
|
|
|
|
|
func main() {
|
|
|
/* Let us create following BST
|
|
|
50
|
|
|
/ \
|
|
|
30 70
|
|
|
/ \ / \
|
|
|
20 40 60 80 */
|
|
|
|
|
|
//To allocate dynamically a new Node in C language : root = (struct Node*) malloc(sizeof(struct Node));
|
|
|
root := New(50)
|
|
|
Insert(root, 30)
|
|
|
Insert(root, 20)
|
|
|
Insert(root, 40)
|
|
|
Insert(root, 70)
|
|
|
Insert(root, 60)
|
|
|
Insert(root, 80)
|
|
|
|
|
|
//Print inoder traversal of the BST
|
|
|
PrintInOrder(root)
|
|
|
}
|