写在前面:本文侧重诠释对算法的思考记录过程,忽略其他诸如代码简洁、字符编码等细节问题。
package main
import "fmt"
type Node struct {
Data int
Left *Node
Right *Node
}
//二叉排序树要求,在树中的任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,
//而右子树节点的值都大于这个节点的值。
//构造二叉排序树的目的,并不是为了排序,而是为了提高查找、插入和删除的速度。
//不论是插入、删除、还是查找,二叉排序树的时间复杂度都等于二叉树的高度,
//最好的情况当然是满二叉树或完全二叉树,时间复杂度是 O(logn),性能相当好
//最差的情况是二叉排序树退化为线性表(斜树),此时的时间复杂度是 O(n)
type BinarySortedTree struct {
Tree *Node
}
//插入节点
func (t *BinarySortedTree) Insert(data int) {
//如果是空树,就插入到根节点
if t.Tree == nil {
t.Tree = &Node{
Data: data}
return
}
tree := t.Tree
for tree != nil {
if data < tree.Data {
if tree.Left == nil {
tree.Left = &Node{
Data: data}
return
}
tree = tree.Left
} else if data > tree.Data {
if tree.Right == nil {
tree.Right = &Node{
Data: data}