Los árboles binarios con valores en las hojas y en los nodos se definen por
data Arbol a = H a
| N a (Arbol a) (Arbol a)
deriving Show |
data Arbol a = H a
| N a (Arbol a) (Arbol a)
deriving Show
Por ejemplo, los árboles
5 8 5 5
/ \ / \ / \ / \
/ \ / \ / \ / \
9 7 9 3 9 2 4 7
/ \ / \ / \ / \ / \ / \
1 4 6 8 1 4 6 2 1 4 6 2 |
5 8 5 5
/ \ / \ / \ / \
/ \ / \ / \ / \
9 7 9 3 9 2 4 7
/ \ / \ / \ / \ / \ / \
1 4 6 8 1 4 6 2 1 4 6 2
se pueden representar por
ej3arbol1, ej3arbol2, ej3arbol3, ej3arbol4 :: Arbol Int
ej3arbol1 = N 5 (N 9 (H 1) (H 4)) (N 7 (H 6) (H 8))
ej3arbol2 = N 8 (N 9 (H 1) (H 4)) (N3 3 (H 6) (H 2))
ej3arbol3 = N 5 (N 9 (H 1) (H 4)) (H 2)
ej3arbol4 = N 5 (H 4) (N 7 (H 6) (H 2)) |
ej3arbol1, ej3arbol2, ej3arbol3, ej3arbol4 :: Arbol Int
ej3arbol1 = N 5 (N 9 (H 1) (H 4)) (N 7 (H 6) (H 8))
ej3arbol2 = N 8 (N 9 (H 1) (H 4)) (N3 3 (H 6) (H 2))
ej3arbol3 = N 5 (N 9 (H 1) (H 4)) (H 2)
ej3arbol4 = N 5 (H 4) (N 7 (H 6) (H 2))
Definir la función
igualEstructura :: Arbol -> Arbol -> Bool |
igualEstructura :: Arbol -> Arbol -> Bool
tal que igualEstructura a1 a2
se verifica si los árboles a1
y a2
tienen la misma estructura. Por ejemplo,
igualEstructura ej3arbol1 ej3arbol2 == True
igualEstructura ej3arbol1 ej3arbol3 == False
igualEstructura ej3arbol1 ej3arbol4 == False |
igualEstructura ej3arbol1 ej3arbol2 == True
igualEstructura ej3arbol1 ej3arbol3 == False
igualEstructura ej3arbol1 ej3arbol4 == False
Soluciones
A continuación se muestran las soluciones en Haskell y las soluciones en Python.
Soluciones en Haskell
data Arbol a = H a
| N a (Arbol a) (Arbol a)
deriving (Show, Eq)
ej3arbol1, ej3arbol2, ej3arbol3, ej3arbol4 :: Arbol Int
ej3arbol1 = N 5 (N 9 (H 1) (H 4)) (N 7 (H 6) (H 8))
ej3arbol2 = N 8 (N 9 (H 1) (H 4)) (N 3 (H 6) (H 2))
ej3arbol3 = N 5 (N 9 (H 1) (H 4)) (H 2)
ej3arbol4 = N 5 (H 4) (N 7 (H 6) (H 2))
igualEstructura :: Arbol a -> Arbol a -> Bool
igualEstructura (H _) (H _) = True
igualEstructura (N _ i1 d1) (N _ i2 d2) =
igualEstructura i1 i2 &&
igualEstructura d1 d2
igualEstructura _ _ = False |
data Arbol a = H a
| N a (Arbol a) (Arbol a)
deriving (Show, Eq)
ej3arbol1, ej3arbol2, ej3arbol3, ej3arbol4 :: Arbol Int
ej3arbol1 = N 5 (N 9 (H 1) (H 4)) (N 7 (H 6) (H 8))
ej3arbol2 = N 8 (N 9 (H 1) (H 4)) (N 3 (H 6) (H 2))
ej3arbol3 = N 5 (N 9 (H 1) (H 4)) (H 2)
ej3arbol4 = N 5 (H 4) (N 7 (H 6) (H 2))
igualEstructura :: Arbol a -> Arbol a -> Bool
igualEstructura (H _) (H _) = True
igualEstructura (N _ i1 d1) (N _ i2 d2) =
igualEstructura i1 i2 &&
igualEstructura d1 d2
igualEstructura _ _ = False
Soluciones en Python
from dataclasses import dataclass
from typing import Generic, TypeVar
A = TypeVar("A")
@dataclass
class Arbol(Generic[A]):
pass
@dataclass
class H(Arbol[A]):
x: A
@dataclass
class N(Arbol[A]):
x: A
i: Arbol[A]
d: Arbol[A]
ej3arbol1: Arbol[int] = N(5, N(9, H(1), H(4)), N(7, H(6), H(8)))
ej3arbol2: Arbol[int] = N(8, N(9, H(1), H(4)), N(3, H(6), H(2)))
ej3arbol3: Arbol[int] = N(5, N(9, H(1), H(4)), H(2))
ej3arbol4: Arbol[int] = N(5, H(4), N(7, H(6), H(2)))
def igualEstructura(a: Arbol[A], b: Arbol[A]) -> bool:
match (a, b):
case (H(_), H(_)):
return True
case (N(_, i1, d1), N(_, i2, d2)):
return igualEstructura(i1, i2) and igualEstructura(d1, d2)
case (_, _):
return False
assert False |
from dataclasses import dataclass
from typing import Generic, TypeVar
A = TypeVar("A")
@dataclass
class Arbol(Generic[A]):
pass
@dataclass
class H(Arbol[A]):
x: A
@dataclass
class N(Arbol[A]):
x: A
i: Arbol[A]
d: Arbol[A]
ej3arbol1: Arbol[int] = N(5, N(9, H(1), H(4)), N(7, H(6), H(8)))
ej3arbol2: Arbol[int] = N(8, N(9, H(1), H(4)), N(3, H(6), H(2)))
ej3arbol3: Arbol[int] = N(5, N(9, H(1), H(4)), H(2))
ej3arbol4: Arbol[int] = N(5, H(4), N(7, H(6), H(2)))
def igualEstructura(a: Arbol[A], b: Arbol[A]) -> bool:
match (a, b):
case (H(_), H(_)):
return True
case (N(_, i1, d1), N(_, i2, d2)):
return igualEstructura(i1, i2) and igualEstructura(d1, d2)
case (_, _):
return False
assert False