¿Cómo comparar dos árboles generales independientemente del orden de los nodos hijos?
Tengo dos árboles generales. La identidad de cada árbol es su nodo raíz. La estructura de datos para representar el árbol es TreeNode.
struct TreeNode{
int data;
vector<treenode> subNodes; // lista de punteros a todos los nodos secundarios de un nodo particular
TreeNode parent; // puntero al nodo padre de este nodo
}
Cada árbol se identifica por su puntero a Nodo raíz.
Quiero comparar dos árboles de tal manera que, aunque el orden de los nodos secundarios de dos nodos correspondientes sea diferente, la función bool compareDeep(TreeNode *root1, TreeNode *root2) debe devolver true.
Para ilustrar, aquí hay algunos ejemplos:
1)
En este caso, bool compareDeep(root1, root2) debería devolver true, ya que el orden de los nodos secundarios difiere pero el contenido es el mismo.
Puedo comparar el caso de igualdad exacta, donde se puede hacer una traversía de orden de nivel de ambos árboles al mismo tiempo, y comparar los nodos nivel por nivel.
En realidad, estoy intentando resolver este problema con respecto a árboles XML, devueltos por el analizador XML, donde quiero comparar dos árboles DOM XML independientemente del orden de los elementos.</treenode*>
davy.ai
Para comparar dos árboles generales, de modo que aunque el orden de los nodos secundarios de los nodos correspondientes sea diferente, se puede implementar la función
bool compareDeep(TreeNode *root1, TreeNode *root2)
siguiendo estos pasos:Verificar si los datos de ambos nodos no son iguales, en cuyo caso los árboles no son iguales, y devolver false.
Verificar si el número de nodos secundarios en ambos nodos no es igual, en cuyo caso los árboles no son iguales, y devolver false.
Iterar sobre los nodos secundarios del primer nodo, y para cada nodo secundario, buscar recursivamente un nodo secundario correspondiente en el segundo nodo. Si se encuentra un nodo secundario correspondiente, llamar recursivamente a
compareDeep
con esos nodos secundarios.Si todos los nodos secundarios del primer nodo tienen nodos secundarios correspondientes en el segundo nodo, los árboles son iguales, y devolver true.
La implementación de la función
compareDeep
para la estructura de datos deTreeNode
en C++ podría ser algo como esto:Esta función se puede llamar con los nodos raíz de dos árboles para comprobar si son iguales, incluso si el orden de los nodos secundarios es diferente. Por ejemplo: