# ==================================================================
# create a tree
# ==================================================================
#
# The "less" link points to (references) nodes in a sub-tree that
# contain values less that a node's value. The "more" link points
# to (references) a sub-tree that contains values greater than a
# node's value.
#
# "None" is used for links that do not point to (reference) a node.
# ==================================================================
#
# (node)
# +-------+
# | more |
# +-->| value |
# (node) | | less |
# +-------+ | +-------+
# | more |--+
# +-->| value |
# (node) | | less |--+ (node)
# (tree) +-------+ | +-------+ | +-------+
# +------+ | more |--+ | | more |
# | tree |---->| value | +-->| value |
# +------+ | less |--+ (node) | less |
# +-------+ | +-------+ +-------+
# | | more |
# +-->| value |
# | less |--+ (node)
# +-------+ | +-------+
# | | more |
# +-->| value |
# | less |
# +-------+
#
# Note: parent links not show in this diagram.
#
# ==================================================================
import sys
# ------------------------------------------------------------------
# define tree node class
#
# data - node's data value
# less - link to nodes with values less than the node's value
# more - link to nodes with values greater than the node's value
# parent - link to parent node
# ------------------------------------------------------------------
class Node:
def __init__(self,parent,data):
self.data = data
self.less = None
self.more = None
self.parent = parent
def getData(self):
return self.data
def setData(self,data):
self.data = data
return
def getLess(self):
return self.less
def setLess(self,node):
self.less = node
return
def getMore(self):
return self.more
def setMore(self,node):
self.more = node
return
def getParent(self):
return self.parent
def setParent(self,node):
self.parent = node
return
# ------------------------------------------------------------------
# define tree class
#
# root - root node of tree
# ------------------------------------------------------------------
class Tree:
def __init__(self):
self.root = None
def getRoot(self):
return self.root
def setRoot(self,node):
self.root = node
return
def addNodeToTree(self,data):
def addNodeToSubTree(rootnode,data):
rootdata = rootnode.getData() # sub-tree root node data
lessnode = rootnode.getLess() # sub-tree root node less link
morenode = rootnode.getMore() # sub-tree root node more link
if rootdata == data: # data equal to root node data?
return # don't do anything (no duplicates)
if data < rootdata: # data less than root node data?
if lessnode != None: # yes, less node exists?
addNodeToSubTree(lessnode,data)
else: # no, less node does not exists
rootnode.setLess(Node(rootnode,data))
if data > rootdata: # data greater than root node data?
if morenode != None: # yes, more node exists?
addNodeToSubTree(morenode,data)
else: # no, more node does not exists
rootnode.setMore(Node(rootnode,data))
return
if self.root == None: # tree empty?
self.root = Node(None,data) # yes, add a tree root node
else: # no, the tree's root node exists
addNodeToSubTree(self.root,data)# add a new node to a sub-tree
return
# --------------------------------------------------------------
# create a test tree
# --------------------------------------------------------------
def createTree(tree):
tree.addNodeToTree(200)
tree.addNodeToTree(300)
tree.addNodeToTree(310)
tree.addNodeToTree(100)
tree.addNodeToTree(290)
tree.addNodeToTree(110)
tree.addNodeToTree(90)
tree.addNodeToTree(10)
return
if __name__ == "__main__":
# --------------------------------------------------------------
# main - create tree
# --------------------------------------------------------------
theTree = Tree()
createTree(theTree)