function ChildChildrenLists = ChildTrees(ChildrenList)
% ChildChildrenLists = ChildTrees(ChildrenList)
%Input: ChildrenList: m + 1 column matrix (of integers) for an m-ary rooted tree
%Output: ChildChildrenLists: an ordered list of s m + 1 column matrices each being a
%children list for the subtree of the s child subtrees of the root of the inputted tree
%Although the child trees can typically get smaller, we use the same
%dimensions for each of them as for the original tree
%Each child tree will basically take all the rows of the main tree
%Children list corresponding to itself and all of its descendant vertices.
[n t] = size(ChildrenList); %n = number of vertices
if n > 1 %There will be children trees
%In order to create a well defined array, we will use the same number of
%rows for each of the outputted child tree matrix. The number of rows will
%be the depth of the original tree. Unallocated rows in
%outputted child tree matrices will be filled with zeros.
ParentList = ChildrenList2ParentList(ChildrenList);
DepthList = ParentList2DepthList(ParentList);
maxRows = max(DepthList(:,2));
%First we find the children of the root:
RootChildren = ChildrenList(1, find(ChildrenList(1,2:t)>0)+1);
ChildChildrenLists = zeros(maxRows,t,length(RootChildren)); %PreAllocate size of output array
for i = 1:length(RootChildren)
DescendantList = DescendantFinder(ChildrenList, RootChildren(i));
DescendantList = [RootChildren(i) DescendantList]; %need to adjoin root child to its decendants
%need corresponding rows of ChildrenList
Rows = [];
for j = 1:length(DescendantList)
newRow = find(ChildrenList(:,1) == DescendantList(j));
Rows = [Rows newRow];
end
ChildChildrenLists(1:length(Rows),:,i) = ChildrenList(Rows,:);
end
else %no children trees
ChildChildrenLists = [];
end