4 # Purpose: tree walker for cython trees
6 # Copyright (c) 2010-2013 by Manfred Moitzi
18 self.stack = stack_init(MAXSTACK)
20 def __dealloc__(self):
21 stack_delete(self.stack)
23 cdef void set_tree(self, node_t *root):
28 stack_reset(self.stack)
33 return <object> self.node.key
37 return <object> self.node.value
41 return (<object>self.node.key, <object>self.node.value)
45 return self.node != NULL
50 while self.node != NULL:
51 cval = ct_compare(key, <object> self.node.key)
55 self.node = self.node.link[0]
57 self.node = self.node.link[1]
61 stack_push(self.stack, self.node)
64 if stack_is_empty(self.stack) != 0:
65 raise IndexError('pop(): stack is empty')
66 self.node = stack_pop(self.stack)
68 def stack_is_empty(self):
69 return <bint> stack_is_empty(self.stack)
72 """ get a leaf node """
73 while self.node != NULL:
74 if self.node.link[0] != NULL:
75 self.node = self.node.link[0]
76 elif self.node.link[1] != NULL:
77 self.node = self.node.link[1]
81 def has_child(self, int direction):
82 return self.node.link[direction] != NULL
84 def down(self, int direction):
85 self.node = self.node.link[direction]
88 self.node = self.node.link[0]
91 self.node = self.node.link[1]
94 return self.node.link[0] != NULL
97 return self.node.link[1] != NULL
99 def succ_item(self, key):
100 """ Get successor (k,v) pair of key, raises KeyError if key is max key
101 or key does not exist.
103 self.node = ct_succ_node(self.root, key)
104 if self.node == NULL: # given key is biggest in tree
105 raise KeyError(str(key))
106 return (<object> self.node.key, <object> self.node.value)
108 def prev_item(self, key):
109 """ Get predecessor (k,v) pair of key, raises KeyError if key is min key
110 or key does not exist.
112 self.node = ct_prev_node(self.root, key)
113 if self.node == NULL: # given key is smallest in tree
114 raise KeyError(str(key))
115 return (<object> self.node.key, <object> self.node.value)
117 def floor_item(self, key):
118 """ Get the element (k,v) pair associated with the greatest key less
119 than or equal to the given key, raises KeyError if there is no such key.
121 self.node = ct_floor_node(self.root, key)
122 if self.node == NULL: # given key is smaller than min-key in tree
123 raise KeyError(str(key))
124 return (<object> self.node.key, <object> self.node.value)
126 def ceiling_item(self, key):
127 """ Get the element (k,v) pair associated with the smallest key greater
128 than or equal to the given key, raises KeyError if there is no such key.
130 self.node = ct_ceiling_node(self.root, key)
131 if self.node == NULL: # given key is greater than max-key in tree
132 raise KeyError(str(key))
133 return (<object> self.node.key, <object> self.node.value)