diff options
Diffstat (limited to 'set/tree.go')
| -rw-r--r-- | set/tree.go | 75 |
1 files changed, 70 insertions, 5 deletions
diff --git a/set/tree.go b/set/tree.go index 2f34cc8..d4f7b7d 100644 --- a/set/tree.go +++ b/set/tree.go @@ -1,7 +1,72 @@ -package tree +package set -type Tree interface { - Empty() bool - Insert(key int, val interface{}) - Search(key int) interface{} +type node struct { + key int + val int + left *node + right *node } + +type Tree struct { + root *node +} + +func NewTree() *Tree { + return &Tree{} +} + +func (t *Tree) Empty() bool { + return t.root == nil +} + +func (t *Tree) set(n *node, key, val int) { + switch { + case key < n.key: + if n.left == nil { + n.left = &node{key, val, nil, nil} + return + } + t.set(n.left, key, val) + + case key > n.key: + if n.right == nil { + n.right = &node{key, val, nil, nil} + return + } + t.set(n.right, key, val) + default: + // Val is already in the tree + } +} + +func (t *Tree) Set(key, val int) { + if t.Empty() { + t.root = &node{key, val, nil, nil} + return + } + t.set(t.root, key, val) +} + +func (t *Tree) get(n *node, key int) (int, error) { + if n == nil { + return 0, NotFound + } + + switch { + case key < n.key: + return t.get(n.left, key) + case key > n.key: + return t.get(n.right, key) + default: + return n.val, nil + } +} + +func (t *Tree) Get(key int) (int, error) { + return t.get(t.root, key) +} + +/* + Get(key int) (int, error) + Del(key int) (int, error) +*/ |
