Curiosamente Visual Basic .NET no incluye una clase de tipo árbol genérica, cosa que descubrí en mi último trabajo, donde me vi obligado a definir e implementar un árbol genérico con diversos métodos, incluyendo uno de búsqueda recursivo (que no incluiré en el ejemplo porque se basaba en los índices de la base de datos, por lo que no sería un método genérico), y que finalmente quedó a medio hacer por finalizarse mi periodo en la empresa.
El árbol genético en cuestión requiere de dos clases: una clase árbol y una clase nodo. La idea es que la clase nodo tenga una colección de otros nodos dentro (sus hijos), para crear la estructura de árbol. También tienen un método que dice si el árbol está vacío y si un nodo es una «hoja» (es decir, si carece de hijos). El método de búsqueda ya depende del tipo de árbol que quieras construir y de por qué propiedad quieras buscar, pero hay algoritmos generales por toda la red. Aquí os dejo el código de las dos clases:
Public Class Tree(Of T)
Private m_Root As TreeNode(Of T) = Nothing
<Description("El nodo raíz del árbol."), _
Category("Data")> _
Public Property Root() As TreeNode(Of T)
Get
Return m_Root
End Get
Set(ByVal value As TreeNode(Of T))
m_Root = value
End Set
End Property
Public Sub Vaciar()
m_Root = Nothing
End Sub
Public Function IsEmpty() As Boolean
If(Not m_Root Is Nothing)
Return true
End If
Return false
End Function
Public Function MakeRoot(ByVal node_item As T) As TreeNode(Of T)
m_Root = New TreeNode(Of T)(node_item)
Return m_Root
End Function
Public Overrides Function ToString() As String
Return m_Root.ToString()
End Function
End Class
Public Class TreeNode(Of T)
Public NodeObject As T
Public Children As New List(Of TreeNode(Of T))
Public Sub New(ByVal node_object As T)
NodeObject = node_object
End Sub
Public Function AddChild(ByVal node_item As T) As TreeNode(Of T)
Dim child_node As New TreeNode(Of T)(node_item)
Children.Add(child_node)
Return child_node
End Function
Public Shadows Function ToString(Optional ByVal indent As Integer = 0) As String
Dim texto As String
texto = New String(" "c, indent) & NodeObject.ToString & vbCrLf
For Each child As TreeNode(Of T) In Children
texto &= child.ToString(indent + 3)
Next child
Return texto
End Function
Public Function IsEmpty() As Boolean
If(Not Children Is Nothing)
Return false
End If
Return true
End Function
End Class
En fin, espero que este texto os sea de ayuda, suerte con la implementación de la búsqueda, que es lo más complejo, pero un árbol perfectamente equilibrado es una forma de optimizar tu programa y ahorrar recursos en las búsquedas.