No problem.
Just to clarify, here is what the tables might look like for this search.
tblCat
CatName, text, name of category, PK
CatCode, long or short integer (your call), code number for this category
Note: This means that you can have synonyms for a code if you make the NAME the PK rather than the code.
tblSubCat
CatCode, long/short integer, major category for this subcategory, part of PK
SubCatName, text, name of category, part of PK
SubCatCode, long/short integer, secondary category code
Again, making the name part of the PK allows synonyms to get to the same subcat code.
tblSubSubCat
CatCode, long/short integer, major category, part of PK
SubCatCode, long/short integer, secondary category, part of PK
SubSubCatName, text, name of category, part of PK
SubSubCatCode, long/short integer, tertiary category code.
Yep, synonyms allowed here, too.
NOW, the many-to-many case you mentioned...
tblCatMapper
CatCode, long/short integer
SubCatCode, long/short integer
SubSubCatCode, long/short integer
ItemCode, long integer, FK to selected item.
You have one entry like this for every item that can be selected by the ItemCode. So a "SELECT ItemCode from tblCatMapper WHERE CatCode = X and SubCatCode = Y and SubSubCatCode = Z ; " selects all items that fall under your selection criteria. Then you have the pointers (ItemCode) to each item and can build your report/display/whatever.
NOTE: This is fixed-structure tree with depth 3. For variable-depth trees, you need a totally different type of selector mechanism that might be more than you want to try right away. Such algorithms exist but they ain't trivial.