Manupilating trees
Project description
Shajara
**Shajara** means "Tree" in Arabic. It is a project for manipulating trees. There is a tree, there is a node and there is node processor.Description
A tree has one node which represents its root. Each node has a label, a value and many children. The arc from the parent to the child is labeled.
Create a tree
Using shajara API
from shajara import Tree, Node
#create a tree with a root labeled "a"
t = Tree(label="a")
# add childrend "b", "c" and "d" to "a"
t.add_child("ab", Node(label="b")).add_child("ac", Node(label="c")).add_child("ad", Node(label="d"))
# go to child "b" and add to it children "e" and "f"
t.select_child("ab").add_child("be", Node(label="e")).add_child("bf", Node(label="f"))
# go up to "a", go to child "d" and add to it children "g" and "h"
t.up().select_child("ad").add_child("dg", Node(label="g")).add_child("dh", Node(label="h"))
Using a dict representation
from shajara.create import GenerateProcessor
from shajara.plot import graphviz_processor
from shajara import Tree
# the tree representation : the arcs must be labeled
rep = {
"label": "a",
"children": {
"ab": {
"label": "b",
"children": {
"be": {"label": "e"},
"bf": {"label": "f"}
}
},
"ac": {"label": "c"},
"ad": {"label": "d"}
}
}
# Create a generator to this representation
generator = GenerateProcessor(rep)
#create an ampty tree (acrually the root exists without a label or a value)
t = Tree()
#fill the tree using the generator
t.process(processor=generator)
Visualize a tree
DOT description of a tree for Graphviz can be generated using GraphvizProcessor
from shajara.plot import graphviz_processor
# create the tree t using one of the methods above
...
#process the tree using graphviz_processor, which returns a DOT description (string)
graph = t.process(processor=graphviz_processor)
# save the description in a file with extension .dot
f = open("graphviz.dot", "w")
f.write(graph)
f.close()
Binary search trees (not balanced)
Create unbalanced binary search trees
from shajara.search import BSearchTree
values = [5, 9, 2, 11, 3, 7, 2]
labels = ["five", "nine", "two", "eleven", "three", "seven", "two_again"]
#create a blank binary tree
t = BSearchTree()
#add the elements using search_add
for i in range(len(values)):
t.search_add(values[i], label=labels[i], add=True)
Search a value
from shajara.search import binary_searcher
# after creating t
# these are the values we want to search
search = [4, 5, 8, 10, 12]
for i in search:
#setting the search value to our search pprocessor
binary_searcher.set_parameters(value=i)
# processing the tree using this processor will return a bool (found or not), a node (if found: the node with the value; else the node with the nearest value) and a relationship ("=", ">", "<")
found, node, rel = t.process(processor=binary_searcher)
if found :
print (str(i) + " is " + node.label)
else:
pos = "before "
if (rel =="<"):
pos = "after "
print (str(i) + " not found. It must be " + pos + str(node.value))
The result :
License
MIT License
Copyright (c) 2020 Abdelkrime Aries
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
shajara-0.1.0.tar.gz
(5.3 kB
view hashes)