You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
2.4 KiB
Go
116 lines
2.4 KiB
Go
// ====================================================
|
|
// 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)
|
|
}
|
|
|
|
// Standard Inorder traversal of tree
|
|
func InOrder(root *Node) {
|
|
//1. Check if the given node is NULL
|
|
if root == nil {
|
|
return
|
|
}
|
|
|
|
InOrder(root.left)
|
|
fmt.Printf("%d ", root.data)
|
|
InOrder(root.right)
|
|
}
|
|
|
|
// Changes left pointers to work as previous pointers in converted DLL
|
|
// The function simply does inorder traversal of Binary Tree and updates
|
|
// left pointer using previously visited node
|
|
var pre *Node = nil
|
|
|
|
func FixPrevPtr(root *Node) {
|
|
//1. Check if the given root is NULL
|
|
if root == nil {
|
|
return
|
|
}
|
|
|
|
FixPrevPtr(root.left)
|
|
root.left = pre
|
|
pre = root
|
|
FixPrevPtr(root.right)
|
|
}
|
|
|
|
// Changes right pointers to work as next pointers in converted DLL
|
|
var prev *Node = nil
|
|
|
|
func FixNextPtr(root *Node) *Node {
|
|
// Find the right most node in BT or last node in DLL
|
|
for root != nil && root.right != nil {
|
|
root = root.right
|
|
}
|
|
|
|
// Start from the rightmost node, traverse back using left pointers.
|
|
// While traversing, change right pointer of nodes.
|
|
for root != nil && root.left != nil {
|
|
prev = root
|
|
root = root.left
|
|
root.right = prev
|
|
}
|
|
|
|
// The leftmost node is head of linked list, return it
|
|
return root
|
|
}
|
|
|
|
func BTToDLL(root *Node) *Node {
|
|
// Set the previous pointer
|
|
FixPrevPtr(root)
|
|
|
|
// Set the next pointer and return head of DLL
|
|
return FixNextPtr(root)
|
|
}
|
|
|
|
func PrintList(root *Node) {
|
|
for root != nil {
|
|
fmt.Printf("%d ", root.data)
|
|
root = root.right
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
|
|
//To allocate dynamically a new Node in C language : root = (struct Node*) malloc(sizeof(struct Node));
|
|
root := New(10)
|
|
|
|
root.left = New(12)
|
|
root.right = New(15)
|
|
|
|
root.left.left = New(25)
|
|
root.left.right = New(30)
|
|
|
|
root.right.left = New(36)
|
|
|
|
fmt.Println("\nInorder Tree Traversal")
|
|
InOrder(root)
|
|
|
|
head := BTToDLL(root)
|
|
fmt.Println("\nDLL Traversal")
|
|
PrintList(head)
|
|
}
|