题目
给定一个数组,要求利用二叉搜索树进行排序
分析:
建好一颗二叉搜索树,中序遍历既是升序排序,
代码:
package main
//利用二叉树实现插入排序
import "fmt"
type tree struct {
value int
left, right *tree
}
func main() {
x := []int{5, 7, 1, 6, 9, 8, 2, 4, 3}
// Sort(x[:])
BSTSort(x)
}
//可作为对外接口
func BSTSort(list []int)[]int{
var root *tree
for _, v := range list {
root = buildtree(root, v) //将切片中的数值植入root中,//有了根节点,往下插入节点,直到到达空的叶子节点,进入分支1创建节点,并链接到t.left,下一次t就是t.left.left,(!!!注意形参和实参,这里要用t.left来接收返回值)
}
result:=[]int{}
res:=MidOrder(root,result)
fmt.Println(res)
return res
}
//用三个if条件控制数据的去向
//1 接收第一个value,tree为空,先创建根节点;2 后续接收value时tree不为空,不进第一个分支,而是对比根节点的值决定走left还是right
func buildtree(t *tree,value int)*tree{
//basecase 创建节点
//一开始没有根节点,创建根节点,赋值
//或者value从根节点对比值,到达一个新的子节点,就要创建叶子节点,给自己赋值为value
if t== nil{//第一个if控制了接收第一个value时,没有树,先建树,相当于创建了根节点
t =new(tree)
t.value=value
return t
}
if value <t.value{//第二个if控制了传入的value比根节点小,就添加到左子树
t.left=buildtree(t.left,value)
}
if value >t.lvalue{//else控制了传入的value比根节点大的情况,添加到右子树
t.right=buildtree(t.right,value)
}
return t
}
//当BST建好后只需要按照中序遍历的方法,将节点的值添加到数组即可,这里直接用了中序遍历的代码
func MidOrder(tree *tree,result []int)[]int {
if tree == nil {
return result
}
// 先打印左子树
result=MidOrder(tree.left,result)
// 再打印根节点,
// fmt.Print(tree.value, " ")
result=append(result,tree.value)
// fmt.Println(result)
// 再打印右字树
result=MidOrder(tree.right,result)
return result
}
问题总结:
1 builetree每个分支要有返回,并且每个分支要有节点作为接收值,否则tleft和 t.right是 nil
2 BSTSort函数建树的时候也要有接收值,否则树是nil
add函数栈分析:
中序遍历函数调用栈: