|
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 addinglocal nodeList = {} newObj.m_categoryCache = {} newObj.m_categoryData = {} return newObjendend then endendendend v.children = nil v.inTree = nil endend then endendend --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 endend --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 categoryend 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 listend |