@@ -78,12 +78,14 @@ def __init__(self, data, name):
78
78
self .parent = None
79
79
self .children = []
80
80
self .head = self
81
- #self.id =get_random_id()
82
- #self.id = data
81
+ self .id = 0
83
82
self .name = name
84
83
self .is_head = False
85
84
self .first_child = None
86
85
self .is_root = False
86
+
87
+ def link (self ):
88
+ return self .data + "_" + str (self .id )
87
89
88
90
def __init__ (self , root = None ):
89
91
self .root = root ;
@@ -99,27 +101,45 @@ def clean(self):
99
101
self .core_content = ""
100
102
self .id = - 1
101
103
102
- def is_different (self , node1 , node2 ):
104
+ def _is_different (self , node1 , node2 ):
103
105
if len (node1 .children ) != len (node2 .children ):
104
106
return True
105
107
for i in range (0 , len (node1 .children )):
106
- if self .is_different (node1 .children [i ], node2 .children [i ]):
108
+ if self ._is_different (node1 .children [i ], node2 .children [i ]):
107
109
return True
108
110
return False
109
111
112
+ def _split_node_children (self , children ):
113
+ uniq_keys = {}
114
+ for child in children :
115
+ if child .data not in uniq_keys :
116
+ uniq_keys [child .data ] = child
117
+ else :
118
+ # same
119
+ uniq_keys [child .data ].id += 1
120
+ child .id = uniq_keys [child .data ].id
121
+
122
+ for i in uniq_keys .values ():
123
+ i .id = 0
124
+
125
+ return children
126
+
110
127
def _uniq_children (self , children ):
111
128
uniq_keys = {}
112
129
uniq_children = []
113
130
for child in children :
114
131
if child .data not in uniq_keys :
115
132
uniq_keys [child .data ] = child
116
133
uniq_children .append (child )
117
- else :
134
+ else :
118
135
# same, if children are the same
119
- if self .is_different (uniq_keys [child .data ], child ):
136
+ if self ._is_different (uniq_keys [child .data ], child ):
137
+ uniq_keys [child .data ].id += 1
138
+ child .id = uniq_keys [child .data ].id
120
139
uniq_children .append (child )
121
- #pass
122
140
141
+ for i in uniq_keys .values ():
142
+ i .id = 0
123
143
124
144
return uniq_children
125
145
@@ -136,18 +156,18 @@ def _travel_tree(self, node):
136
156
if is_simplify :
137
157
uniq_children = self ._uniq_children (node .children )
138
158
else :
139
- uniq_children = node .children
159
+ uniq_children = self . _split_node_children ( node .children )
140
160
141
161
if node .first_child :
142
162
if node .is_root :
143
163
new_root = "\t %s [label=\" <%s>%s\" , color=red];\n " % (node .name , node .data , node .data )
144
164
self .core_content += new_root
145
165
#print new_root
146
- new_node = "\t %s [label=\" %s\" ];\n " % (node .first_child .name , " | " .join (["<" + i .data + ">" + i .data for i in uniq_children ]))
166
+ new_node = "\t %s [label=\" %s\" ];\n " % (node .first_child .name , " | " .join (["<" + i .link () + ">" + i .data for i in uniq_children ]))
147
167
self .core_content += new_node
148
168
#print new_node
149
- left = "\t %s:%s" % (node .head .name , node .data )
150
- right = "%s:%s" % (node .first_child .name , node .first_child .data )
169
+ left = "\t %s:%s" % (node .head .name , node .link () )
170
+ right = "%s:%s" % (node .first_child .name , node .first_child .link () )
151
171
style = "[dir=both, arrowtail=dot];\n "
152
172
new_link = "%s -> %s%s" % (left , right , style )
153
173
self .core_content += new_link
0 commit comments