二叉树的结构定义如下:
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())
}
京公网安备 11010502036488号