Golang算法(二)数据结构

type Stack struct {
	head *Node 
}

type Node struct {
	data interface{}
	next *Node
}

func NewStack()*Stack  {
	s:=&Stack{
		head: &Node{
			data: nil,
			next: &Node{},
		},
	}
	return s
}

func (s *Stack)Push(data interface{})  {
	n:=&Node{
		data: data,
		next: s.head,
	}
	s.head=n
}

func (s *Stack)Pop()(interface{},bool)  {
	if s.head==nil{
		return nil,false
	}
	n:=s.head
	s.head=s.head.next
	return n.data,true
}

队列

type Queue struct {
	head *Node
	tail *Node
}

func (q *Queue) Enqueue(data interface{}) {
	node:=&Node{
		data: data,
		next: nil,
	}
	if q.tail==nil{
		q.head=node
		q.tail=node
	}else {
		q.tail.next=node
		q.tail=node
	}
}

func (q *Queue) Dequeue()(interface{},bool) {
	if q.head==nil{
		return nil,false
	}
	d:=q.head.data
	q.head=q.head.next
	if q.head==nil{
		q.tail=nil
	}
	return d,true

}

func (q Queue) String() string    {
	node:=q.head
	var arr []interface{}
	for node!=nil {
		arr=append(arr,node.data)
		node=node.next
	}
	return fmt.Sprintf("%v",arr)
}

func NewQueue() *Queue {
	q:=&Queue{}
	return q
}

双向链表

type DoubleLinkedList struct {
	head *DoubleNode
}
type DoubleNode struct {
	data interface{}
	pre *DoubleNode
	next *DoubleNode
}

func NewDLL()*DoubleLinkedList  {
	d:=&DoubleLinkedList{}
	return d
}

func (d *DoubleLinkedList)Insert(data interface{})  {
	dn:=&DoubleNode{
		data: data,
		pre:  nil,
		next: d.head,
	}
	if d.head!=nil{
		d.head.pre=dn
	}
	d.head=dn
}

func (d *DoubleLinkedList)Search(data interface{}) bool {
	if d.head==nil{
		return false
	}
	n:=d.head
	for n!=nil{
		if n.data==data{
			return true
		}
		n=n.next
	}
	return false
}

func (D DoubleLinkedList) String() string    {
	node:=D.head
	var arr []interface{}
	for node!=nil {
		arr=append(arr,node.data)
		node=node.next
	}
	return fmt.Sprintf("%v",arr)
}

二叉搜索树

type BinaryTree struct {
	Root *TreeNode
}
type TreeNode struct {
	Data int
	Left *TreeNode
	Right *TreeNode
	Parent *TreeNode
}

func NewTree()*BinaryTree  {
	return &BinaryTree{}
}

func InOrder(t *TreeNode){
	if t!=nil{
		InOrder(t.Left)
		fmt.Print(t.Data,",")
		InOrder(t.Right)
	}
}

func PreOrder(t *TreeNode){
	if t!=nil{
		fmt.Print(t.Data,",")
		PreOrder(t.Left)
		PreOrder(t.Right)
	}
}

func PostOrder(t *TreeNode){
	if t!=nil{
		PostOrder(t.Left)
		PostOrder(t.Right)
		fmt.Print(t.Data,",")
	}
}

func (t *TreeNode)Serch(data int) *TreeNode{
	if t==nil{
		return nil
	}
	if t.Data==data{
		return t
	}else if data>t.Data{
		return t.Right.Serch(data)
	}else {
		return t.Left.Serch(data)
	}
}
func (t *BinaryTree)Insert(data int){
	n:=&TreeNode{
		Data: data,
	}
	if t.Root==nil{
		t.Root=n
		return
	}
	x:=t.Root
	var y *TreeNode
	for x!=nil{
		y=x
		if x.Data<data{
			x=x.Right
		} else {
			x=x.Left
		}
	}
	n.Parent=y
	//注意不能直接让x=n,因为x是nil,不是y的子节点
	if y.Data>data{
		y.Left=n
	}else {
		y.Right=n
	}
}
func (t *BinaryTree) Replace(src, dest *TreeNode) {
	if dest.Parent == nil {
		t.Root = src
	} else if dest == dest.Parent.Left {
		dest.Parent.Left = src
	} else {
		dest.Parent.Right = src
	}
	src.Parent = dest.Parent
}
func (t *BinaryTree) Delete(n *TreeNode) {
	if n.Left == nil {
		t.Replace(n.Right,n)
	}else if n.Right==nil{
		t.Replace(n.Left,n)
	}else {
		//找到n右子树上最小的值
		y:=n.Right.Minimum()
		if y!=n.Right{
			//如果最小值不是n的子节点,则需要和n的右子节点换一下,保证n的右子节点左侧没有挂在
			//,因为要让n的左侧挂在到n的右子节点上去
			t.Replace(y,n.Right)
			n.Right.Parent=y
		}
		t.Replace(y,n)
		//将n的左子树挂在到y上
		y.Left=n.Left
		n.Left.Parent=y
	}
}

func (n *TreeNode) Minimum() *TreeNode {
	x:=n
	for x!=nil&&x.Left!=nil {
		x = x.Left
	}
	return x
}

func (n *TreeNode) FillNode(data int, left, right, parent *TreeNode) {
	n.Left = left
	n.Right = right
	n.Parent = parent
	n.Data = data
}

红黑树

红黑树比二叉搜索树多一个属性:color
满足下列几个性质:
1.每个节点都是红色或者黑色的
2.根节点是黑色的
3.每个叶节点(NIL)是黑色的
4.如果一个节点是红色的,那么它的两个子节点都是黑色的
5.对于每个节点,从该节点到其所有叶子结点的简单路径上,均包含相同数目的黑色节点
引理:
1.一棵有n个内部个节点的红黑树的高度至多为2lg(n+1)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值