二叉树的结构定义如下:
type Node struct { Left, Right *Node Data interface{} }
实现以下操作:
- 前中后序遍历
- 求叶子结点数量
- 求树的深度
- 判断树中是否存在某个值
- 树的销毁
- 树的翻转
- 树的拷贝
package main import ( "bufio" "fmt" "os" "reflect" "strconv" "strings" ) type Node struct { Left, Right *Node Data interface{} } /** 通过传入的切片来进行创建二叉树 */ func (node *Node) CreateFromSlice(data []interface{}) *Node { if node == nil { return nil } var bin *Node if len(data) < 2 { return nil } bin = new(Node) bin.Data = data[0] // 设置当前结点的值 bin.Left = bin.CreateFromSlice(data[1:]) // 递归创建左子树 bin.Right = bin.CreateFromSlice(data[2:]) // 递归创建右子树 return bin } /** 通过从键盘输入的方式来创建二叉树 */ func (node *Node) CreateFromInput() *Node { reader := bufio.NewReader(os.Stdin) //读取输入的内容 fmt.Print("请输入结点数字(输入-1结束):") in, err := reader.ReadString('\n') fmt.Println() if err != nil { fmt.Println("获取输入出错, 程序退出!") os.Exit(1) } in = strings.Replace(in, "\n", "", 1) // 输入in带有\n, 无法转数字,先去除 num, err := strconv.Atoi(in) // 转换为数字类型 if err != nil { fmt.Println("输入非法, 程序退出!", err.Error()) os.Exit(1) } if num == -1 { return nil } var bin *Node bin = new(Node) bin.Data = num fmt.Printf("添加结点: {%d} 左子树:\n", bin.Data) bin.Left = bin.CreateFromInput() fmt.Printf("添加结点: {%d} 右子树:\n", bin.Data) bin.Right = bin.CreateFromInput() return bin } /** 先序遍历: 根->左->右 先打印当前结点值, 再递归调用左子树的先序遍历方法 接着递归调用右子树的先序遍历方法 */ func (node *Node) PrevSort() { if node == nil { return } fmt.Print(node.Data, " ") node.Left.PrevSort() node.Right.PrevSort() } /** 中序遍历: 左->根->右 */ func (node *Node) MidSort() { if node == nil { return } node.Left.MidSort() // 左子树递归调用此方法 fmt.Print(node.Data, " ") // 中, 打印结点 node.Right.MidSort() // 右子树递归调用此方法 } /** 后序遍历: 左->右->根 */ func (node *Node) PostSort() { if node == nil { return } node.Right.PostSort() node.Right.PostSort() fmt.Print(node.Data, " ") } /* 二叉树的深度 */ func (node *Node) Height() int { if node == nil { return 0 } leftHeight := node.Left.Height() // 左子树递归进入 rightHeight := node.Right.Height() // 右子树递归进入 if leftHeight > rightHeight { // 左右子树进行比较, 累加递归返回值 leftHeight++ return leftHeight }else { rightHeight++ return rightHeight } } // 计算二叉树结点数量 func (node *Node) LeafNum(n *int) { if node == nil { return } if node.Left == nil && node.Right == nil { (*n)++ } node.Left.LeafNum(n) node.Right.LeafNum(n) } // 判断二叉树是否存在某个元素 func (node *Node) Search(Data interface{}) { if node == nil { return } // 判断类型和值是否相等 if reflect.DeepEqual(node.Data, Data) { return } // 左右子树递归查找 node.Left.Search(Data) node.Right.Search(Data) } // 销毁二叉树 func (node *Node) Destroy() { if node == nil { return } // 递归销毁左子树 node.Left.Destroy() node.Left = nil // 递归销毁右子树 node.Right.Destroy() node.Right = nil node = nil } // 二叉树的翻转 func (node *Node) Reverse() { if node == nil { return } // 交换左右子树 node.Left, node.Right = node.Right, node.Left // 递归翻转 node.Left.Reverse() node.Right.Reverse() } // 二叉树的拷贝 func (node *Node) Copy() * Node { if node == nil { return nil } left := node.Left.Copy() right := node.Right.Copy() newNode := new(Node) newNode.Data = node.Data newNode.Left = left newNode.Right = right return newNode } func main() { //nums := []interface{}{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12} node := new(Node) fmt.Println("创建根节点: ") node = node.CreateFromInput() fmt.Printf("先序遍历: \n\n") node.PrevSort() fmt.Println(node.Height()) }