/// <summary>
        /// Get all unique taxon tree nodes.
        /// This method operates on current taxon tree in contrast to
        /// the full taxon tree with all taxon tree nodes.
        /// </summary>
        /// <returns>All taxon tree nodes.</returns>
        public virtual TaxonTreeNodeList GetTaxonTreeNodes()
        {
            TaxonTreeNodeList taxonTreeNodes;

            taxonTreeNodes = new TaxonTreeNodeList(true);
            if (Parents.IsNotEmpty())
            {
                // Add parent taxon tree nodes.
                foreach (ITaxonTreeNode parentTaxonTreeNode in Parents)
                {
                    GetParentTaxonTreeNode(parentTaxonTreeNode, taxonTreeNodes);
                }
            }

            // Add this taxon tree node.
            taxonTreeNodes.Add(this);

            if (Children.IsNotEmpty())
            {
                // Add child taxon tree nodes.
                foreach (ITaxonTreeNode childTaxonTreeNode in Children)
                {
                    GetChildTaxonTreeNode(childTaxonTreeNode, taxonTreeNodes);
                }
            }

            return(taxonTreeNodes);
        }
        /// <summary>
        /// Get parent taxon tree nodes.
        /// This method operates on current taxon tree in contrast to
        /// the full taxon tree with all taxon tree nodes.
        /// </summary>
        /// <param name="taxonTreeNode">Current parent taxon tree node.</param>
        /// <param name="parentTaxonTreeNodes">Accumulated parent taxon tree nodes so far.</param>
        private void GetParentTaxonTreeNode(ITaxonTreeNode taxonTreeNode,
                                            TaxonTreeNodeList parentTaxonTreeNodes)
        {
            // Add this taxon tree node.
            parentTaxonTreeNodes.Merge(taxonTreeNode);

            if (taxonTreeNode.Parents.IsNotEmpty())
            {
                // Add parent taxon tree nodes.
                foreach (ITaxonTreeNode parentTaxonTreeNode in taxonTreeNode.Parents)
                {
                    GetParentTaxonTreeNode(parentTaxonTreeNode, parentTaxonTreeNodes);
                }
            }
        }
        /// <summary>
        /// Get child taxon tree nodes.
        /// This method operates on current taxon tree in contrast to
        /// the full taxon tree with all taxon tree nodes.
        /// </summary>
        /// <param name="taxonTreeNode">Current child taxon tree node.</param>
        /// <param name="childTaxonTreeNodes">Accumulated child taxon tree nodes so far.</param>
        private void GetChildTaxonTreeNode(ITaxonTreeNode taxonTreeNode,
                                           TaxonTreeNodeList childTaxonTreeNodes)
        {
            // Add this taxon tree node.
            childTaxonTreeNodes.Merge(taxonTreeNode);

            if (taxonTreeNode.Children.IsNotEmpty())
            {
                // Add child taxon tree nodes.
                foreach (ITaxonTreeNode childTaxonTreeNode in taxonTreeNode.Children)
                {
                    GetChildTaxonTreeNode(childTaxonTreeNode, childTaxonTreeNodes);
                }
            }
        }