İkili Ağacın Dengeli olup olmadığını Kontrol Etmek İçin En Kısa Programı Yazınız


15

Dengeli bir ikili ağaçtaki her düğüm için, sol alt alt ağaç ve sağ alt alt ağacın yüksekliklerindeki maksimum fark en fazla 1'dir.

İkili bir ağacın yüksekliği, kök düğümden kök çocuğuna kökten en uzak olan mesafedir.

Aşağıda bir örnek verilmiştir:

           2 <-- root: Height 1
          / \
         7   5 <-- Height 2
        / \   \
       2   6   9 <-- Height 3
          / \  /
         5  11 4 <-- Height 4 

İkili ağacın yüksekliği: 4

Aşağıdakiler ikili ağaçlar ve dengeli olup olmadıklarına dair bir rapordur:

Test Durumu 1

Yukarıdaki ağaç dengesiz .

Test Durumu 2

Yukarıdaki ağaç dengelidir .

İkili bir ağacın kökünü girdi olarak kabul eden ve ağaç dengesizse bir falsey değeri ve ağaç dengeli ise doğruluk değeri döndüren mümkün olan en kısa programı yazın.

Giriş

İkili ağacın kökü. Bu, kök nesneye bir referans veya hatta bir ikili ağacın geçerli bir temsili olan bir liste şeklinde olabilir.

Çıktı

Doğruluk değerini döndürür: Ağaç dengeli ise

İade değeri Falsey: Ağaç ise un dengeli.

İkili Ağacın Tanımı

Ağaç, bir değer ve iki ağaç veya işaretçi içeren bir nesnedir.

İkili ağacın yapısı aşağıdaki gibi görünür:

typedef struct T
{
   struct T *l;
   struct T *r;
   int v;
}T;

İkili ağaç için liste gösterimi kullanılıyorsa, aşağıdakine benzer bir şey olabilir:

[root_value, left_node, right_node]

2
Girdi boş ağaç olabilir mi?
tsh

1
İlk ağaç örneğinizde, yaprağı kaldırırsanız 4kalan ağaç dengeli mi?
Neil

Hayır, bu örnek değil, ASCII sanatı kullanarak ilkini kastetmiştim.
Neil

Kendi uygulamama göre "C, 117 bayt": Hayır, çünkü "5" den başlayan sağ subarm ağacının yüksekliği 2 ve sol subarm ağacının yüksekliği 0'dır.
T. Salim

Düzenlemeler en az 6 karakterdir, ancak lütfen 'dengeli' ve 'ikili' arasındaki virgülleri kaldırın - 'ikili ağaç' bir isim ifadesidir, bu yüzden 'dengeli, ikili ağaç' yazmak 'kırmızı, kar mobil' e eşdeğerdir - virgül gerekli değildir.
Geza Kerecsenyi

Yanıtlar:


8

Jöle , 11 bayt

ḊµŒḊ€IỊ;߀Ạ

Çevrimiçi deneyin!

Boş ağaç ile temsil edilir [].


Erik, bu soruyu ilk cevaplayanlardan biri olduğu için teşekkürler. Jelly kesinlikle bu sitede çok popüler bir dildir. Bence bu dili uygulama özgürlüğünü almalıyım. Sağlam bir golf komut dosyası dilinden öğrenmek güzel.
T. Salim

Tebrikler Outgolfer Erik, sen kazanıyorsun.
T. Salim

3

Prolog (SWI) , 49 bayt

N+_/B/C:-X+B,Y+C,abs(X-Y)<2,N is max(X,Y)+1.
0+e.

Çevrimiçi deneyin!

Value/Left_Child/Right_ChildBoş ağaç atom olan ağaçları temsil eder e. Tanımlar +/2, bir ilişkisiz değişken ile başarı ya da başarısızlık yoluyla çıkış, sol ve sağda ağaç (ya da bir önceden ağacın yüksekliğine eşit), - Yüksekliği bağımsız değişken kabul edilemez ise, tanımlamak için 9 bayt ekleyin -T:-_+T..

N + _/B/C :-            % If the second argument is a tree of the form _Value/B/C,
    X+B,                % X is the height of its left child which is balanced,
    Y+C,                % Y is the height of its right child which is balanced,
    abs(X-Y) < 2,       % the absolute difference between X and Y is strictly less than 2,
    N is max(X,Y)+1.    % and N is the height of the full tree.
0 + e.                  % If, on the other hand, the second argument is e, the first is 0.

(Her düğümün değeri girişten _/çıkartılabiliyorsa, -2 bayt için çıkartılabilir.)
İlişkisiz Dize

3

Wolfram Dili (Mathematica) , 50 bayt

f@_[x_,y_]:=f@x&&f@y&&-2<Depth@x-Depth@y<2;f@_=1>0

NullBoş, value[left, right]düğümler için kullanın . Örneğin, aşağıdaki ağaç olarak yazılır 2[7[2[Null, Null], 6[5[Null, Null], 11[Null, Null]]], 5[Null, 9[4[Null, Null], Null]]].

    2
   / \
  7   5
 / \   \
2   6   9
   / \  /
  5  11 4

Çevrimiçi deneyin!


Gerçekten çok güzel!
Greg Martin

3

Python 3.8 (ön sürüm) , 133125 bayt

b=lambda t:((max(l[0],r[0])+1,abs(l[0]-r[0])<2)if(l:=b(t[1]))[1]and(r:=b(t[2]))[1]else(0,0))if t else(0,1)
h=lambda t:b(t)[1]

Çevrimiçi deneyin!

"Liste" biçiminde bir ağaç alır: Bir düğüm, düğümlerle [value, left, right]birlikte leftve rightdüğümlerdir.

İşlevi çağırın h.

İade 0veya Falsedengesiz ağaç için. İade 1veya Truedengeli bir ağaç için.

Ungolfed:

# Returns tuple (current height, subtrees are balanced (or not))
def balanced(tree):
  if tree: # [] evaluates to False
    left = balanced(tree[1])
    right = balanced(tree[2])
    # If  the subtrees are not both balanced, nothing to do, just pass it up
    if left[1] and right[1]:
      height = max(left[0], right[0]) + 1
      subtrees_balanced = abs(left[0] - right[0]) < 2
    else:
      height = 0 # Value doesn't matter, will be ignored
      subtrees_balanced = False
  else:
    height = 0
    subtrees_balanced = True
  return (height, subtrees_balanced)

def h(tree):
  return balanced(tree)[1]

-10: Geriye döndürülmüş mantık kurtulmak için nots

Bir çağrının ortasında argümanlar almaya izin verilirse, bu kısaltılabilir (115 bayt)

(b:=lambda t:((max(l[0],r[0])+1,abs(l[0]-r[0])<2)if(l:=b(t[1]))[1]and(r:=b(t[2]))[1]else(0,0))if t else(0,1))(_)[1]

ile _kontrol etmek ağaç olma.



2

JavaScript, 162 bayt

f=x=>{for(f=0,s=[[x,1]];s[0];){if(!((d=(t=s.pop())[0]).a&&d.b||f))f=t[1];if(f&&t[1]-f>1)return 0;if(d.a)s.push([d.a,t[1]+1]);if(d.b)s.push([d.b,t[1]+1])}return 1}

Çevrimiçi deneyin!

Girdinin biçimi bir nesnedir

root={a:{node},b:{node},c:value}

açıklama

for(f=0,s=[[x,1]];s[0];){if(!((d=(t=s.pop())[0]).a&&d.b||f))f=t[1]

Genişlik ilk aramanın yapılması, bir veya daha fazla dalı olmayan ilk düğümün derinliğini bulur.

if(f&&t[1]-f>1)return 0;if(d.a)s.push([d.a,t[1]+1]);if(d.b)s.push([d.b,t[1]+1])}

Genişliği ilk aramaya devam ederek, herhangi bir eleman ilk düğüm eksik dalların derinliğinden iki daha derinse sıfır döndürün.

return 1}

Böyle bir düğüm bulunamazsa, 1 döndürün


1
Büyük olasılıkla ilk önce daha iyi arama yapmanın bir yolu var ama düşünemedim.
fəˈnɛtɪk

1
Bunun, yaprağı çıkardığınızda dengelenmesi gereken ilk örnek gibi bazı geçerli durumlar için başarısız olduğunu düşünüyorum 4.
Neil

1

Julia, 56 bayt

f(t)=t!=()&&(-(f.(t.c)...)^2<2 ? maximum(f,t.c)+1 : NaN)

İkili ağacı temsil eden aşağıdaki yapı ile:

struct Tree
    c::NTuple{2,Union{Tree,Tuple{}}}
    v::Int
end

csol ve sağ düğümleri temsil eden bir demet olup boş demet ()bir düğümün olmadığını belirtmek için kullanılır.

Falsey değeri NaN, herhangi bir tam sayı doğrudur.


1
Kodlamanın UTF-8 olduğunu varsayarsak, bu TIO'nun yerleşik bayt sayacına göre aslında 57 bayttır . Her neyse, CG&CC'ye hoş geldiniz!
İlişkisiz String

1
Evet haklısın. Bunu düzelttim, şimdi 56 bayt olacak
user3263164


0

C, 117 bayt

h(T*r){r=r?1+h(h(r->l)>h(r->r)?r->l:r->r):0;}b(T*r){return r->l&&!b(r->l)||r->r&&!b(r->r)?0:abs(h(r->l)-h(r->r))<=1;}

Yapının uygulanması aşağıdaki gibidir:

 typedef struct T
    {
        struct T * l;

        struct T * r;

        int v;

    } T;

Bunu JDoodle'ta Deneyin


Bu 117 bayt gibi görünüyor, ancak <2bunun yerine son kontrol için yapabilirsiniz
Jo King

Ayrıca, bunun ne kadar geçerli olduğundan emin değilim, çünkü gönderim dışında tanımlanan bir veri yapısına dayanıyor
Jo King

0

Python 2 , 99 96 94 bayt

lambda A:A==[]or(abs(D(A[1])-D(A[2]))<2)*f(A[1])*f(A[2])
D=lambda A:A>[]and-~max(map(D,A[1:]))

Çevrimiçi deneyin!

Jo King'den 3 bayt .

Girişi şu şekilde alır: boş düğüm []ve diğer düğümler [<value>, <leftNode>, <rightNode>]. 0/1Yanlış / Doğru için çıkışlar .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.