EPiServer's PageTree class has a function called CreateItemRecursive and this is where you can add your logic to include or exclude elements from the tree.

In my example I added two properties to mye ExtendedPageTree control which takes in a comma seperated list of pagetypesnames that the user wants to filter on. Here is my example code for this:

 public class ExtendedPageTree : PageTree
    {
        public string IncludeOnlyPageTypeNames { get; set; }
        public string ExcludePageTypeNames { get; set; }

        protected override void CreateChildControls()
        {
            PageData page = PageReference.IsNullOrEmpty(RootLink) ? null : GetPage(RootLink);
            CreateTemplateControl(page, HeaderTemplate, 0, false);
            CreateItemsRecursive(1, string.Empty);
            CreateTemplateControl(page, FooterTemplate, 0, false);
        }

        private void CreateItemsRecursive(int level, string path)
        {
            PageHierarchicalEnumerable enumerable = PageLoader.HierarchicalSelect(path);
            if ((enumerable.Pages.Count != 0) && !PageReference.IsNullOrEmpty(RootLink))
            {
                PageHierarchyData data = (path != string.Empty)
                                             ? ((PageHierarchyData) enumerable.GetParent())
                                             : new PageHierarchyData(PageSource.GetPage(RootLink), PageLoader);
                CreateTemplateControl(data.Page, IndentTemplate, level, data.HasChildren);
                foreach (PageHierarchyData data2 in enumerable)
                {
                    PageData page = data2.Page;
                    if (!string.IsNullOrEmpty(ExcludePageTypeNames))
                    {
                        string[] pagetypenames = ExcludePageTypeNames.Split(',');
                        bool dontInclude = false;
                        foreach (string s in pagetypenames)
                        {
                            if (s.Equals(page.PageTypeName, StringComparison.CurrentCultureIgnoreCase))
                            {
                                dontInclude = true;
                                break;
                            }
                        }
                        if(dontInclude) continue;
                    }

                    if (!string.IsNullOrEmpty(IncludeOnlyPageTypeNames))
                    {
                        string[] pagetypenames = IncludeOnlyPageTypeNames.Split(',');
                        bool include = false;
                        foreach (string s in pagetypenames)
                        {
                            if (s.Equals(page.PageTypeName, StringComparison.CurrentCultureIgnoreCase))
                            {
                                include = true;
                                break;
                            }
                        }
                        if(!include) continue;
                    }

                    CreateTemplateControl(page, ItemHeaderTemplate, data2.Indent, data2.HasChildren);
                    CreateItemTemplateControl(page, level, data2.HasChildren,
                                              (CurrentPage == null)
                                                  ? PageReference.EmptyReference
                                                  : CurrentPage.PageLink);
                    if ((data2.HasChildren && ((NumberOfLevels == -1) || (level < NumberOfLevels))) &&
                        IsExpanded(data2.Page.PageLink))
                    {
                        CreateItemsRecursive(level + 1, page.PageLink.ToString());
                    }
                    CreateTemplateControl(page, ItemFooterTemplate, level, data2.HasChildren);
                }
                CreateTemplateControl(data.Page, UnindentTemplate, level, data.HasChildren);
            }
        }

        private void CreateItemTemplateControl(PageData page, int level, bool hasChildren, PageReference currentPageLink)
        {
            var template = new PageTemplateContainer(page, level, hasChildren);
            if (level == 1)
            {
                if (page.PageLink.CompareToIgnoreWorkID(currentPageLink) && IsExpanded(page.PageLink))
                {
                    InstantiateSelectedExpandedTopTemplate(template);
                }
                else if (IsExpanded(page.PageLink))
                {
                    InstantiateExpandedTopTemplate(template);
                }
                else if (page.PageLink.CompareToIgnoreWorkID(currentPageLink))
                {
                    InstantiateSelectedTopTemplate(template);
                }
                else
                {
                    InstantiateTopTemplate(template);
                }
            }
            else if (page.PageLink.CompareToIgnoreWorkID(currentPageLink) && IsExpanded(page.PageLink))
            {
                InstantiateSelectedExpandedItemTemplate(template);
            }
            else if (IsExpanded(page.PageLink))
            {
                InstantiateExpandedItemTemplate(template);
            }
            else if (page.PageLink.CompareToIgnoreWorkID(currentPageLink))
            {
                InstantiateSelectedItemTemplate(template);
            }
            else
            {
                InstantiateItemTemplate(template);
            }
            Controls.Add(template);
        }
    }