vxorg/python_refonly/tree.py
modeco80 af49206a16 Rewrite it in C++
rust people are going to be very mad at me now /j
2024-10-21 12:22:35 -04:00

82 lines
No EOL
1.8 KiB
Python

# node of the tree
class TreeNode:
def __init__(self):
self.item = None # Can be anything (a string currently)
# Only one parent can exist
self.parent = None
self.is_sample = False
self.children = []
# creates a child node
def create_leaf(self):
node = TreeNode()
node.parent = self
self.children.append(node)
return node
# returns true if this node is an "leaf" node, i.e:
# it has no children to continue with
def is_leaf(self):
if len(self.children) == 0:
return True
return False
def create_child_leaf(self, item):
node = self.create_leaf()
node.item = item
return node
def walk_children(self, fn):
fn(self)
# walk children nodes if this node isn't an leaf node
if not self.is_leaf():
for node in self.children:
node.walk_children(fn)
# find a single child. Returns None if no child with name ecists
def find_child(self, name):
if self.item == name:
return self
for node in self.children:
if node.item == name:
return node
return None
def get_parent_count(self):
# Walk the parents to figure out current tree depth
# and how many
parent = self.parent
parent_count = 0
while parent is not None:
parent_count += 1
parent = parent.parent
return parent_count
# def walk_children(self, fn):
# fn(self)
# for node in self.children:
# fn(node)
# for other_node in node.children:
# fn(other_node)
class Tree:
def __init__(self):
# create a root node
self.root = TreeNode()
#self.root.item = '(root)'
def walk(self, fn):
self.root.walk_children(fn)
#for node in self.root.children:
# node.walk_children(fn)
#fn(node)
#for other_node in node.children:
# fn(other_node)
# creates a leaf in the root node and populates it
def create_leaf(self, item):
leaf_node = self.root.create_child()
leaf_node.item = item
return leaf_node