close all
%Each node contains a character followed by its
occurancein the tree.
%If tree doesn't contain English Alphabets or spacebar,
comma, fullstop
%it's represented as '$'.
else
[t
node(j)]=t.addnode(s_siblings2,['$',num2str(0)]);
j=j+1;
val=[str(1,i),num2str(1)];
data=[data,s1];
[t node(j)]=t.addnode(s_siblings2,val);
j=j+1;
code=[];
if(s1_val<2*r1)
code=[code,dec2bin(s1_val-1,e+1)];
encode=[encode,nyt1,code];
encode1=[];
encode1=[nyt1,code];
else
code=[code,dec2bin(s1_val-r1-1,e)];
encode=[encode,nyt1,code];
encode1=[];
encode1=[nyt1,code];
end
end
end
end
j2=j-1;%sum update
%AFTER THE CHARACTER IS INCLUDED OR UPDATED IN THE
TREE, EACH SIBLING
%SUM VALUR IS UPDATED TO PARENT
for x=j2:-2:2
s_n=getsiblings(t,node(x));%first sibling
data1=t.get(node(s_n(1,1)));
s_d_tmp=size(data1);
s_d1=s_d_tmp(1,2);
sum1=str2num(data1(1,2:s_d1));%second sibling
data2=t.get(node(s_n(1,2)));
s_d_tmp=size(data2);
s_d1=s_d_tmp(1,2);
sum2=str2num(data2(1,2:s_d1));
sum=sum1+sum2;%sum the both sibling value
val=['$',num2str(sum)];
s_p=getparent(t,node(x));%update in the parent
node
t=t.set(node(s_p),val);
end
j3=j-1;%swap function
%IF LEFT NODE SUM IS GREATER THAN RIGHT, THEN SWAP
WHOLE BRANCH TO
%RIGHT SIDE.
for x1=2:j3
s_n=getsiblings(t,node(x1));
data1=t.get(node(s_n(1,1)));%FIRST NODE
s_d_tmp=size(data1);
s_d1=s_d_tmp(1,2);
cmp1=str2num(data1(1,2:s_d1));
data2=t.get(node(s_n(1,2)));%%SECOND NODE
s_d_tmp=size(data2);
s_d1=s_d_tmp(1,2);
cmp2=str2num(data2(1,2:s_d1));
if(cmp1>=cmp2)%compare the two sum of siblings
s_p1=getparent(t,node(s_n(1,1))); %swap the
branches of tree with their parent
nt=subtree(t,node(s_n(1,1)));%store the
branch as new tree
t=t.chop(node(s_n(1,1)));%cut that branch
t = t.graft(node(s_p1), nt);%add it to the
parent tree as a branch to parent node
end
end
end
Tree Code:
classdef tree
properties (SetAccess = private)
% Hold the data at each node
Node = { [] };
end
methods
% CONSTRUCTOR
if nargin < 1
root_ID = 1;
return
end
if isa(content, 'tree')
% Copy constructor
obj.Parent = content.Parent;
if nargin > 1
if strcmpi(val, 'clear')
obj.Node =
cell(numel(obj.Parent), 1);
else
cellval = cell(numel(obj.Parent),
1);
for i = 1 : numel(obj.Parent)
cellval{i} = val;
end
obj.Node = cellval;
end
else
obj.Node = content.Node;
end
else
% New object with only root content
obj.Node = { content };
root_ID = 1;
end
end
% METHODS
if parent == 0
% Replace the whole tree by overiding the
root.
obj.Node = { data };
obj.Parent = 0;
ID = 1;
return
end
obj.Parent = [
obj.Parent
parent ];
ID = numel(obj.Node);
end
parent = obj.Parent;
flag = ~any( parent == ID );
end
end
parent = obj.Parent(ID);
IDs = obj.getchildren(parent);
end
function n = nnodes(obj)
%% NNODES Return the number of nodes in the
tree.
n = numel(obj.Parent);
end
end
% STATIC METHODS
methods (Static)
hl = decorateplots(ha)
lineage_AB = tree('AB');
[lineage_AB, id_ABa] = lineage_AB.addnode(1,
'AB.a');
[lineage_AB, id_ABp] = lineage_AB.addnode(1,
'AB.p');
[lineage_AB, id_ABal] =
lineage_AB.addnode(id_ABa, 'AB.al');
[lineage_AB, id_ABar] =
lineage_AB.addnode(id_ABa, 'AB.ar');
[lineage_AB, id_ABala] =
lineage_AB.addnode(id_ABal, 'AB.ala');
[lineage_AB, id_ABalp] =
lineage_AB.addnode(id_ABal, 'AB.alp');
[lineage_AB, id_ABara] =
lineage_AB.addnode(id_ABar, 'AB.ara');
[lineage_AB, id_ABarp] =
lineage_AB.addnode(id_ABar, 'AB.arp');
[lineage_AB, id_ABpl] =
lineage_AB.addnode(id_ABp, 'AB.pl');
[lineage_AB, id_ABpr] =
lineage_AB.addnode(id_ABp, 'AB.pr');
[lineage_AB, id_ABpla] =
lineage_AB.addnode(id_ABpl, 'AB.pla');
[lineage_AB, id_ABplp] =
lineage_AB.addnode(id_ABpl, 'AB.plp');
[lineage_AB, id_ABpra] =
lineage_AB.addnode(id_ABpr, 'AB.pra');
[lineage_AB, id_ABprp] =
lineage_AB.addnode(id_ABpr, 'AB.prp');
lineage_P1 = tree('P1');
[lineage_P1, id_P2] = lineage_P1.addnode(1,
'P2');
[lineage_P1, id_EMS] = lineage_P1.addnode(1,
'EMS');
[lineage_P1, id_P3] =
lineage_P1.addnode(id_P2, 'P3');
[lineage_P1, id_C] =
lineage_P1.addnode(id_P2, 'C');
[lineage_P1, id_Ca] =
lineage_P1.addnode(id_C, 'C.a');
[lineage_P1, id_Caa] =
lineage_P1.addnode(id_Ca, 'C.aa');
[lineage_P1, id_Cap] =
lineage_P1.addnode(id_Ca, 'C.ap');
[lineage_P1, id_Cp] =
lineage_P1.addnode(id_C, 'C.p');
[lineage_P1, id_Cpa] =
lineage_P1.addnode(id_Cp, 'C.pa');
[lineage_P1, id_Cpp] =
lineage_P1.addnode(id_Cp, 'C.pp');
[lineage_P1, id_MS] =
lineage_P1.addnode(id_EMS, 'MS');
[lineage_P1, id_MSa] =
lineage_P1.addnode(id_MS, 'MS.a');
[lineage_P1, id_MSp] =
lineage_P1.addnode(id_MS, 'MS.p');
[lineage_P1, id_E] =
lineage_P1.addnode(id_EMS, 'E');
[lineage_P1, id_Ea] =
lineage_P1.addnode(id_E, 'E.a');
[lineage_P1, id_Eal] =
lineage_P1.addnode(id_Ea, 'E.al'); %#ok<*NASGU>
[lineage_P1, id_Ear] =
lineage_P1.addnode(id_Ea, 'E.ar');
[lineage_P1, id_Ep] =
lineage_P1.addnode(id_E, 'E.p');
[lineage_P1, id_Epl] =
lineage_P1.addnode(id_Ep, 'E.pl');
[lineage_P1, id_Epr] =
lineage_P1.addnode(id_Ep, 'E.pr');
[lineage_P1, id_P4] =
lineage_P1.addnode(id_P3, 'P4');
[lineage_P1, id_Z2] =
lineage_P1.addnode(id_P4, 'Z2');
[lineage_P1, id_Z3] =
lineage_P1.addnode(id_P4, 'Z3');
[lineage_P1, id_D] =
lineage_P1.addnode(id_P3, 'D');
lineage = tree('Zygote');
lineage = lineage.graft(1, lineage_AB);
lineage = lineage.graft(1, lineage_P1);
end
end
end