-
Notifications
You must be signed in to change notification settings - Fork 5
/
reformatTree.m
70 lines (57 loc) · 1.49 KB
/
reformatTree.m
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
function [inc numnode newt] = reformatTree(thisNode, t, upnext)
% binarize
kids = t.kids(:,thisNode);
kids = kids(find(kids));
isLeafNodeKids = t.isLeafnode(kids(1));
while length(kids) == 1 && isLeafNodeKids ~= 1
kkids = t.kids(:,kids(1));
kkids = kkids(find(kkids));
t.pp(kids(1)) = -1;
t.pp(kkids) = thisNode;
t.kids(1:length(kkids),thisNode) = kkids;
kids = kkids;
isLeafNodeKids = t.isLeafnode(kids(1));
end
numnode = 0;
isLeafNodeKids = t.isLeafnode(kids(1));
if length(kids) == 1 && isLeafNodeKids
t.isLeafnode(thisNode) = 1;
t.pp(kids(1)) = -1;
t.kids(:,thisNode) = 0;
inc = 0;
numnode = 1;
else
inc = 0;
for k = 1:length(kids);
isLeafNodeKids = t.isLeafnode(kids(k));
if ~isLeafNodeKids
[thisinc thisnumnode newt] = reformatTree(kids(k), t, upnext+inc);
inc = inc+ thisinc;
t = newt;
numnode = numnode+thisnumnode;
else
numnode = numnode+1;
end
end
next = upnext + inc;
n = length(kids);
last = kids(end);
start = n-1;
while n >= 2
if (n == 2)
next = thisNode;
else
next = next + 1;
inc = inc+1;
end
t.pp(last) = next;
t.pp(kids(start)) = next;
t.kids(:, next) = 0;
t.kids(1, next) = kids(start);
t.kids(2, next) = last;
last = next;
start = start-1;
n = n - 1;
end
end
newt = t;