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

测试结果:

 

posted @ 2021-03-25 16:14  天外归云  阅读(86)  评论(0编辑  收藏  举报