-
Notifications
You must be signed in to change notification settings - Fork 25
/
Copy pathgenericTree.py
139 lines (112 loc) · 3.37 KB
/
genericTree.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#Implementation of generic tree in Python
import random
import string
import pptree
class TreeNode(object):
"Node of a Tree"
def __init__(self, name='root', children=None,parent=None):
self.name = name
self.parent=parent
self.children = []
if children is not None:
for child in children:
self.add_child(child)
def __repr__(self):
return self.name
def is_root(self):
if self.parent is None:
return True
else:
return False
def is_leaf():
if len(self.children) == 0:
return True
else:
return False
def depth(self): # Depth of current node
if self.is_root():
return 0
else:
return 1 + self.parent.depth()
def add_child(self, node):
node.parent=self
assert isinstance(node, TreeNode)
self.children.append(node)
def disp(self):
pptree.print_tree(self,'children','name')
class Tree:
"""
Tree implemenation as a collection of TreeNode objects
"""
def __init__(self):
self.root=None
self.height=0
self.nodes=[]
def insert(self,node,parent): # Insert a node into tree
if parent is not None:
parent.add_child(node)
else:
if self.root is None:
self.root=node
self.nodes.append(node)
def search(self,data): # Search and return index of Node in Tree
index=-1
for N in self.nodes:
index+=1
if N.name == data:
break
if index == len(self.nodes)-1:
return -1 #node not found
else:
return index
def getNode(self,id):
return self.nodes[id]
def root():
return self.root
#----------------------------------------------------------------------
# Binary TreeNode Implementation
class BinaryTreeNode(Tree):
def __init__(self, name='root', children=None,parent=None):
pass
#----------------------------------------------------------------------
##def getNodeRandom(node,level):
## if level==1:
## return node
## else:
## if(len(node.children) >0):
## newnode=getNodeRandom(node.children[random.randint(0,len(node.children)-1)],level-1)
## return newnode
## else:
## return node
##def TreeBuilder(steps): # Random Tree Builder
##
## root=TreeNode() #root node
## depth=0
##
##
## while(steps > 0):
## #Randomly add tree nodes
## tmax=random.randint(2,5)
## depth=depth+1 #increase depth in each step
## node2=getNodeRandom(root,depth) #get a random node at current level
## if node2 is None:
## print("Invalid Node reached")
## break
##
## for i in range(tmax):
## node2.add_child(TreeNode((random.choice(string.ascii_letters)+str(i)).upper()))
##
## steps=steps-1
##
## return root # Returns root of Tree
def TreeBuilder2(steps): # Random Tree Builder using Full Structure
root=TreeNode('root')
tree=Tree()
tree.insert(root,None)
for i in range(steps):
tree.insert(TreeNode(random.choice(string.ascii_letters)+str(i)),tree.nodes[random.randint(0,len(tree.nodes)-1)])
return tree
newtree=TreeBuilder2(50)
newtree.root.disp()
##root=TreeBuilder(10)
##root.disp()