算法69-二叉搜索树排序

题目

给定一个数组,要求利用二叉搜索树进行排序

分析:

建好一颗二叉搜索树,中序遍历既是升序排序,

代码:

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函数栈分析:
在这里插入图片描述
中序遍历函数调用栈:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值