package main
import "fmt"
/*面向对象
* go语言仅支持封装,不支持继承和多态,继承和多态用接口来做,面向接口编程
* go语言没有class,只有struct
* 不论地址还是结构体本身,一律使用"."来访问成员
*/
//结构体定义
type TreeNodestruct {
Value int
Left,Right *TreeNode
}
/*
*为结构体定义方法,定义在结构体外部
*(node TreeNode)接收者
*值传递
*与一般函数的区别是把参数拿到了前面
*编译器知道你是要值还是要指针,不加指针是值传递不能改变值
*显示定义和命名方法收者
*使用指针才可以改变结构内容
*nil指针也能调用方法
*要改变内容必须使用指针接收者
*结构过大建议使用指针接收者
*一致性:有指针接收者,最好都用指针接收者
*值接受者是go语言特有的
*值/指针接收者均可接收值/指针
*/
func (node TreeNode) print() {
fmt.Println(node.Value)
}
func (node *TreeNode) setValue(value int) {
if node == nil {
fmt.Println("node 为 nil")
return
}
node.Value = value
}
//中式遍历
func (node *TreeNode) traverse() {
if node == nil {
return
}
node.Left.traverse()
node.print()
node.Right.traverse()
}
//工厂函数,go可以返回局部变量的地址给外部用,不需要知道内存分配在堆上还是栈上,由go环境来决定分配在哪里,go语言有垃圾回收机制,编译器会自动把没有用的回收掉
func createTreeNode(value int) *TreeNode {
return &TreeNode{Value:value}
}
func main() {
//var root TreeNode
root := TreeNode{Value:3}
fmt.Println(root)
root.Left = &TreeNode{}//left类型是指针所以要取地址
root.Right = &TreeNode{5,nil,nil}
root.Right.Left = new(TreeNode)//new内建函数,返回一个TreeNode的地址
root.Left.Right = createTreeNode(9)
fmt.Println(root)
root.print()
root.setValue(7)
root.print()
p := &root
p.setValue(100)
p.print()
var d *TreeNode
d.setValue(100)
d = &root
d.setValue(400)
d.print()
root.traverse()
nodes := []TreeNode{
{Value:3},
{},
{6,nil,&root},
}
fmt.Println(nodes)
}