// ====================================================
// 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)
}

func main() {
	//To allocate dynamically a new Node in C language : root = (struct Node*) malloc(sizeof(struct Node));
	root := New(1)
	/*
		        1
		      /   \
		     NULL  NULL
	*/

	root.left = New(2)
	root.right = New(3)
	/* 2 and 3 become left and right children of 1
	           1
	         /   \
	        2      3
	     /    \    /  \
	    NULL NULL NULL NULL
	*/

	root.left.left = New(4)
	/* 4 becomes left child of 2
	           1
	       /       \
	      2          3
	    /   \       /  \
	   4    NULL  NULL  NULL
	  /  \
	NULL NULL
	*/

	fmt.Println("Root data : ", root.data)
	fmt.Println("Root->Left  data : ", root.left.data)
	fmt.Println("Root->Right data : ", root.right.data)
	fmt.Println("Root->Left->Left data : ", root.left.left.data)
}
