Fixed merkle implementation to fit official algorithm.

This commit is contained in:
Jae Kwon
2014-05-20 16:33:10 -07:00
parent 7032d3b84a
commit 795e183273
4 changed files with 236 additions and 99 deletions

54
merkle/util.go Normal file
View File

@@ -0,0 +1,54 @@
package merkle
import (
"fmt"
)
func Iterator(node Node) NodeIterator {
stack := make([]Node, 0, 10)
var cur Node = node
var tn_iterator NodeIterator
tn_iterator = func()(tn Node, next NodeIterator) {
if len(stack) > 0 || cur != nil {
for cur != nil {
stack = append(stack, cur)
cur = cur.Left()
}
stack, cur = pop(stack)
tn = cur
cur = cur.Right()
return tn, tn_iterator
} else {
return nil, nil
}
}
return tn_iterator
}
func pop(stack []Node) ([]Node, Node) {
if len(stack) <= 0 {
return stack, nil
} else {
return stack[0:len(stack)-1], stack[len(stack)-1]
}
}
func PrintIAVLNode(node *IAVLNode) {
fmt.Println("==== NODE")
printIAVLNode(node, 0)
fmt.Println("==== END")
}
func printIAVLNode(node *IAVLNode, indent int) {
indentPrefix := ""
for i:=0; i<indent; i++ {
indentPrefix += " "
}
if node == nil {
fmt.Printf("%s--\n", indentPrefix)
} else {
printIAVLNode(node.left, indent+1)
fmt.Printf("%s%v:%v\n", indentPrefix, node.key, node.height)
printIAVLNode(node.right, indent+1)
}
}