Huffman二叉树构建

package main

import (
	"unsafe"
	"fmt"
)

type TreeNode struct {
	x int
	lchild *TreeNode
	rchild *TreeNode
}

type Tree TreeNode

func initTreeNode(x []int) []*TreeNode {
	nodes:=make([]*TreeNode,len(x))
	for i:=0; i<len(x); i++ {
		nodes[i]=&TreeNode{x[i],nil,nil}
	}
	return nodes
}

func quichSort(nodes []*TreeNode,s int,t int)  {
	if s>=t {
		return
	}
	key:=nodes[s]
	i:=s
	j:=t
	for i<j {
		for i<j && nodes[j].x>=key.x {
			j--
		}
		if i<j {
			nodes[i],nodes[j]=nodes[j],nodes[i]
		}
		for i<j && nodes[i].x<=key.x {
			i++
		}
		if i<j {
			nodes[i],nodes[j]=nodes[j],nodes[i]
		}
	}
	quichSort(nodes,s,i-1)
	quichSort(nodes,i+1,t)
}

func insertNode(nodes []*TreeNode,m *TreeNode) []*TreeNode {
	n:=len(nodes)
	y:=make([]*TreeNode,n+1)
	copy(y,nodes)
	for i:=n; i>=0; i-- {
		if i>0 && y[i-1].x>=m.x {
			y[i]=y[i-1]
		} else {
			y[i]=m
			break
		}
	}
	return y
}

func createTree(nodes []*TreeNode) *Tree {
	node1:=nodes[0]
	node2:=nodes[1]
	node:=&TreeNode{node1.x+node2.x,node1,node2}
	n:=len(nodes)
	if n<3 {
		return (*Tree)(unsafe.Pointer(node))
	} else {
		y:=make([]*TreeNode,n-2)
		copy(y,nodes[2:])
		y=insertNode(y,node)
		return createTree(y)
	}
}

func pretravel(tree *Tree)  {
	node:=(*TreeNode)(unsafe.Pointer(tree))
	fmt.Print(node.x," ")
	if node.lchild!=nil {
		pretravel((*Tree)(unsafe.Pointer(node.lchild)))
	}
	if node.rchild!=nil {
		pretravel((*Tree)(unsafe.Pointer(node.rchild)))
	}
}

func midtravel(tree *Tree)  {
	node:=(*TreeNode)(unsafe.Pointer(tree))
	if node.lchild!=nil {
		midtravel((*Tree)(unsafe.Pointer(node.lchild)))
	}
	fmt.Print(node.x," ")
	if node.rchild!=nil {
		midtravel((*Tree)(unsafe.Pointer(node.rchild)))
	}
}

func lasttravel(tree *Tree)  {
	node:=(*TreeNode)(unsafe.Pointer(tree))
	if node.lchild!=nil {
		lasttravel((*Tree)(unsafe.Pointer(node.lchild)))
	}
	if node.rchild!=nil {
		lasttravel((*Tree)(unsafe.Pointer(node.rchild)))
	}
	fmt.Print(node.x," ")
}

func main()  {
	x:=[]int{29,8,14,7,23}
	nodes:=initTreeNode(x)
	quichSort(nodes,0,len(nodes)-1)
	tree:=createTree(nodes)
	pretravel(tree)
	midtravel(tree)
	lasttravel(tree)
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值