이진 트리의 균형이 맞는지 확인하는 가장 짧은 프로그램 작성


16

균형 이진 트리의 각 노드에 대해 왼쪽 자식 하위 트리와 오른쪽 자식 하위 트리의 높이 차이는 최대 1입니다.

이진 트리의 높이는 루트 노드에서 루트에서 가장 먼 노드 자식까지의 거리입니다.

아래는 예입니다.

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

이진 트리의 높이 : 4

다음은 이진 트리와 균형이 맞는지 여부에 대한 보고서입니다.

테스트 사례 1

위의 나무는 균형맞지 않습니다 .

테스트 사례 2

위의 트리는 균형맞습니다 .

이진 트리의 루트를 입력으로 받아들이고 트리의 균형이 맞지 않으면 거짓 값을, 트리가 균형을 이루면 참 값을 반환하는 가능한 가장 짧은 프로그램을 작성하십시오.

입력

이진 트리의 루트 이것은 루트 객체에 대한 참조 형식이거나 이진 트리의 유효한 표현 인 목록 일 수도 있습니다.

산출

진실한 값을 반환합니다 : 나무가 균형 잡힌 경우

반환 값을 falsey : 나무 인 경우 유엔 균형.

이진 트리의 정의

트리는 값과 다른 두 개의 트리 또는 포인터를 포함하는 객체입니다.

이진 트리의 구조는 다음과 같습니다.

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

이진 트리에 대해 목록 표현을 사용하는 경우 다음과 같이 보일 수 있습니다.

[root_value, left_node, right_node]

2
빈 트리가 입력 될 수 있습니까?
tsh

1
나무의 초기 예에서 leaf을 제거 4하면 나머지 나무의 균형이 유지됩니까?
Neil

아니요, 그 예가 아니라 ASCII 아트를 사용하여 초기 예를 의미했습니다.
Neil

본인의 구현 "C, 117 바이트"에 따르면 : "5"에서 시작하는 오른쪽 아암 트리의 높이는 2이고 왼쪽 아암 트리의 높이는 0이므로 0입니다.
T. Salim

수정 사항은 6 자 이상이지만 'balanced'와 'binary'사이에서 쉼표를 제거하십시오. 'binary tree'는 명사구이므로 'balanced, binary tree'를 쓰는 것은 'red, snow mobile'과 같습니다. 쉼표는 필요하지 않습니다.
Geza Kerecsenyi

답변:


8

젤리 , 11 바이트

ḊµŒḊ€IỊ;߀Ạ

온라인으로 사용해보십시오!

빈 트리는로 표시됩니다 [].


이 질문에 최초로 답변 해 주신 Erik에게 감사드립니다. 젤리는 확실히이 사이트에서 매우 인기있는 언어입니다. 이 언어를 구현하려면 자유를 가져야한다고 생각합니다. 강력한 골프 스크립팅 언어에서 배우기에 좋습니다.
T. Salim

축하합니다 Outgolfer Erik, 당신은 승자입니다.
T. Salim

3

프롤로그 (SWI) , 49 바이트

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

온라인으로 사용해보십시오!

같은 나무 나타냅니다 Value/Left_Child/Right_Child빈 나무가 원자 인와를 e. +/2왼쪽에 언 바운드 변수 (또는 이미 트리의 높이와 같은 변수)와 오른쪽에있는 트리를 사용하여 성공 또는 실패를 통해 출력하는을 정의합니다 . height 인수를 사용할 수없는 경우 9 바이트를 추가하여 정의하십시오 -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.

(각 노드의 값을 입력에서 생략 _/할 수 있으면 -2 바이트 동안 제거 할 수 있습니다.)
관련이없는 문자열


3

Python 3.8 (시험판) , 133125 바이트

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]

온라인으로 사용해보십시오!

은 "목록"형식으로 나무를 취 노드는 [value, left, right]함께 left하고 right있는 노드.

함수를 호출하십시오 h.

반환 0또는 False불균형 트리. 반환 1또는 True균형 잡힌 트리.

언 골프 드 :

# 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 : nots를 제거하기위한 역 논리

호출 도중 인수를 허용하는 경우 (115 바이트)로 단축 될 수 있습니다.

(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]

으로 _확인하는 나무 인.



2

자바 스크립트, 162 바이트

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}

온라인으로 사용해보십시오!

입력 형식은 객체입니다

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

설명

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])}

폭이 넓은 첫 번째 탐색을 계속하면 요소가 첫 번째 노드 누락 분기의 깊이보다 두 배 더 깊은 경우 0을 반환합니다.

return 1}

그러한 노드가 없으면 1을 리턴하십시오.


1
광범위한 첫 번째 검색을 더 잘 수행 할 수있는 방법이있을 수 있지만 생각하지 못했습니다.
fəˈnɛtɪk

1
리프를 제거 할 때 균형을 유지해야하는 첫 번째 예제와 같은 일부 유효한 경우에는 이것이 실패한다고 생각합니다 4.
Neil

1

줄리아, 56 바이트

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

이진 트리를 나타내는 다음 구조체를 사용하십시오.

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

c왼쪽 및 오른쪽 노드를 나타내는 튜플 ()이며 빈 튜플 은 노드가 없음을 나타내는 데 사용됩니다.

Falsey 값은 NaN모든 정수가 진실입니다.


1
인코딩이 UTF-8이라고 가정하면 TIO의 내장 바이트 카운터 에 따르면 실제로 57 바이트 입니다. 어쨌든 CG & CC에 오신 것을 환영합니다!
관련이없는 문자열

1
네 말이 맞아. 실제로 56 바이트가되도록 수정했습니다
Simeon Schaub


0

C, 117 바이트

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;}

구조 구현은 다음과 같습니다.

 typedef struct T
    {
        struct T * l;

        struct T * r;

        int v;

    } T;

JDoodle에서 이것을 시도하십시오


<2마지막 검사를 위해 대신 할 수 있지만 이것은 117 바이트 인 것으로 보입니다
Jo King

또한 제출 외부에 정의 된 데이터 구조에 의존하기 때문에 이것이 얼마나 유효한지 잘 모르겠습니다
Jo King

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.