{"id":3359,"date":"2017-06-09T06:00:18","date_gmt":"2017-06-09T04:00:18","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=3359"},"modified":"2021-04-25T17:03:03","modified_gmt":"2021-04-25T15:03:03","slug":"ancestro-comun-mas-bajo-17","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/ancestro-comun-mas-bajo-17\/","title":{"rendered":"Ancestro com\u00fan m\u00e1s bajo"},"content":{"rendered":"<p>El tipo de los \u00e1rboles binarios se define por<\/p>\n<pre lang=\"text\">\n   data Arbol = H Int\n              | N Int Arbol Arbol\n<\/pre>\n<p>Por ejemplo, el \u00e1rbol<\/p>\n<pre lang=\"text\">\n        5\n       \/ \\\n      \/   \\\n     3     7\n    \/ \\   \/ \\\n   1   4 6   9\n<\/pre>\n<p>se define por<\/p>\n<pre lang=\"text\">\n   ejArbol :: Arbol\n   ejArbol = N 5 (N 3 (H 1) (H 4)) (N 7 (H 6) (H 9))\n<\/pre>\n<p>Un \u00e1rbol ordenado es un \u00e1rbol binario tal que para cada nodo, los elementos de su sub\u00e1rbol izquierdo son menores y los de su sub\u00e1rbol derecho son mayores. El \u00e1rbol anterior es un \u00e1rbol ordenado.<\/p>\n<p>Los ancestros de un nodo x son los nodos y tales que x est\u00e1 en alguna de las ramas de x. Por ejemplo, en el \u00e1rbol anterior los ancestros de 9 son 5 y 7.<\/p>\n<p>El <a href=\"http:\/\/bit.ly\/2qYXz2Y\">ancestro com\u00fan m\u00e1s bajo<\/a> de dos elementos x e y de un \u00e1rbol a es el ancestro de x e y de menor profundidad. Por ejemplo, en el \u00e1rbol anterior el ancestro com\u00fan m\u00e1s bajo de 6 y 9 es 7.<\/p>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   ancestroComunMasBajo :: Arbol -> Int -> Int -> Int\n<\/pre>\n<p>tal que (ancestroComunMasBajo a x y) es el ancestro de menor profundidad de los nodos x e y en el \u00e1rbol ordenado a, donde x e y son dos elementos distintos del \u00e1rbol a. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   ancestroComunMasBajo ejArbol 4 1  ==  3\n   ancestroComunMasBajo ejArbol 1 6  ==  5\n   ancestroComunMasBajo ejArbol 6 9  ==  7\n<\/pre>\n<h4>Soluciones<\/h4>\n<p>[schedule expon=&#8217;2017-06-16&#8242; expat=\u00bb06:00&#8243;]<\/p>\n<ul>\n<li>Las soluciones se pueden escribir en los comentarios hasta el 16 de junio.\n<li>El c\u00f3digo se debe escribir entre una l\u00ednea con &#60;pre lang=\u00bbhaskell\u00bb&#62; y otra con &#60;\/pre&#62;\n<\/ul>\n<p>[\/schedule]<\/p>\n<p>[schedule on=&#8217;2017-06-16&#8242; at=\u00bb06:00&#8243;]<\/p>\n<pre lang=\"haskell\">\r\ndata Arbol = H Int\r\n           | N Int Arbol Arbol\r\n\r\nejArbol :: Arbol\r\nejArbol = N 5 (N 3 (H 1) (H 4)) (N 7 (H 6) (H 9))\r\n\r\n-- 1\u00aa definici\u00f3n\r\n-- =============\r\n\r\nancestroComunMasBajo1 :: Arbol -> Int -> Int -> Int\r\nancestroComunMasBajo1 a x y =\r\n  head [u | u <- xs, u `elem` ys]\r\n  where xs = ancestros a x\r\n        ys = ancestros a y\r\n\r\n-- (ancestros a x) es la lista de los ancestros de x en el \u00e1rbol\r\n-- ordenado a, ordenada por profundidad. Por ejemplo,\r\n--    ancestros ejArbol 1 ==  [3,5]\r\n--    ancestros ejArbol 3 ==  [5]\r\n--    ancestros ejArbol 5 ==  []\r\n--    ancestros ejArbol 9 ==  [7,5]\r\nancestros :: Arbol -> Int -> [Int]\r\nancestros a y = aux a y []\r\n  where aux (H _)     _ zs = zs\r\n        aux (N x i d) y zs \r\n          | x == y    = zs\r\n          | y < x     = aux i y (x:zs)\r\n          | otherwise = aux d y (x:zs)\r\n\r\n-- 2\u00aa definici\u00f3n\r\n-- =============\r\n\r\nancestroComunMasBajo2 :: Arbol -> Int -> Int -> Int\r\nancestroComunMasBajo2 (N z i d) x y \r\n  | x < z &#038;&#038; y < z = ancestroComunMasBajo2 i x y \r\n  | x > z && y > z = ancestroComunMasBajo2 d x y \r\n  | otherwise      = z\r\n<\/pre>\n<p>[\/schedule]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>El tipo de los \u00e1rboles binarios se define por data Arbol = H Int | N Int Arbol Arbol Por ejemplo, el \u00e1rbol 5 \/ \\ \/ \\ 3 7 \/ \\ \/ \\ 1 4 6 9 se define por ejArbol :: Arbol ejArbol = N 5 (N 3 (H 1) (H 4)) (N&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[2],"tags":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3359"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/comments?post=3359"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3359\/revisions"}],"predecessor-version":[{"id":3360,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3359\/revisions\/3360"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=3359"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=3359"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=3359"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}