Golang构造二叉树解决整数排序问题
[本文出自天外归云的博客园]
构造二叉树解决这个排序问题,代码如下:
package pintia import ( "strconv" "strings" ) // SortedNumber 具有排序属性的数字结构 type SortedNumber struct { Self int Left *SortedNumber Right *SortedNumber } var sortedNumbers []string // NumbersSort 将输入的任意n个整数从小到大输出 // 输入格式:输入在一行中给出n个整数,其间以空格分隔 // 输出格式:在一行中将n个整数从小到大输出,其间以“->”相连 func NumbersSort(threeNumsStr string) (sortedNumbersStr string) { nums := strings.Split(threeNumsStr, " ") intNumber, _ := strconv.Atoi(nums[0]) sortedNumber := SortedNumber{Self: intNumber} for i := 1; i < len(nums); i++ { intNumber, _ := strconv.Atoi(nums[i]) PutNumberOnTree(&sortedNumber, intNumber) } GetNumberOffTree(sortedNumber) sortedNumbersStr = strings.Join(sortedNumbers, "->") return } // GetNumberOffTree 把整数从树上摘下来 func GetNumberOffTree(sortedNumber SortedNumber) { if sortedNumber.Left != nil { GetNumberOffTree(*sortedNumber.Left) } sortedNumbers = append(sortedNumbers, strconv.Itoa(sortedNumber.Self)) if sortedNumber.Right != nil { GetNumberOffTree(*sortedNumber.Right) } } // PutNumberOnTree 把整数放到树上 func PutNumberOnTree(sortedNumber *SortedNumber, intNumber int) { if intNumber >= sortedNumber.Self { // fmt.Printf("%+v大于%+v\n", intNumber, sortedNumber.Self) if sortedNumber.Right == nil { sortedNumber.Right = &SortedNumber{ Self: intNumber, } } else { PutNumberOnTree(sortedNumber.Right, intNumber) } } else { // fmt.Printf("%+v小于%+v\n", intNumber, sortedNumber.Self) if sortedNumber.Left == nil { sortedNumber.Left = &SortedNumber{ Self: intNumber, } } else { PutNumberOnTree(sortedNumber.Left, intNumber) } } }
其中先后用到的思想是:
1. PutNumberOnTree 数上树(按规则上树)
2. GetNumberOffTree 树摘数(按规则下树)
单测:
package pintia import ( "testing" "github.com/stretchr/testify/assert" ) func TestThreeNumbersSort(t *testing.T) { // 准备待测数据 var numbersStr = "-1 -4 -2 9 -999 8 0 6 4 5 3 2 1 7 8 9 9 100" var expectStr = "-999->-4->-2->-1->0->1->2->3->4->5->6->7->8->8->9->9->9->100" // 执行待测方法 sortedNumberStr := NumbersSort(numbersStr) t.Log(sortedNumberStr) // 断言 assert := assert.New(t) assert.Equal(expectStr, sortedNumberStr, "排序错误") }
测试脚本:
method=$1 fileList=`ls` cmd="go test -v" for file in $fileList do if echo "$file" | grep -q -E '\.go$';then cmd="${cmd} $file" fi done cmd="$cmd -test.run $method -gcflags=-l" $cmd
运行脚本命令:
sh exec_test.sh TestThreeNumbersSort
测试结果:
本文来自博客园,作者:天外归云,转载请注明原文链接:https://www.cnblogs.com/LanTianYou/p/14577950.html