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 140 141 |
--list to hold node order for adding
local nodeList = { }
newObj . m_categoryCache = { }
newObj . m_categoryData = { }
return newObj
end
end
then
end
end
end
end
v . children = nil
v . inTree = nil
end
end
then
end
end
end
--build the data node
--collect nodes that lead to the data (ex. [grandParent, parent, data])
local currCatId = parentCatId
local currCat = nil
-- Prevent cycles
local visited = { }
while ( currCatId ~= nil ) do
if ( visited [ currCatId ] ) then break end
visited [ currCatId ] = true
currCatId = currCat . parentId
end
end
--we've just processed the leaf node, quit
if ( # nodeList == 0 ) then
return
end
--collect the next node and strike it from the list
local currNode = nodeList [ # nodeList ]
--node list is cleared out in the process of inserting the data
nodeList [ # nodeList ] = nil
--if we found the category is already in the tree, continue on...
if ( currNode . inTree ) then
return
end
--otherwise, add the category
end
local low = 1
local mid
--search out the insert position
while ( low <= high ) do
if ( compVal > 0 ) then
low = mid + 1
else
high = mid - 1
end
end
end
--leaf nodes have no id and no children
if ( node . id ) then
node . children = { }
end
node . inTree = true
--ordered add
return
end
--unordered add, or it's at the end of the ordered list
end |