이진 탐색 트리 예제

combinatorics에서 하나는 주어진 크기의 전체 이진 트리의 수를 계산하는 문제를 고려한다. 여기서 나무는 노드에 연결된 값이 없으며(이것은 가능한 트리 수를 쉽게 결정된 계수로 곱할 뿐이며, 나무는 구조로만 구별됩니다.) 그러나 모든 노드의 왼쪽 및 오른쪽 자식이 구별됩니다(다른 트리인 경우 서로 교환하면 원래 노드와 구별되는 트리가 생성됩니다). 트리의 크기는 내부 노드(자식이 두 개 있는 노드)의 번호 n으로 이동합니다. 다른 노드는 리프 노드이며 그 중 n + 1이 있습니다. 크기 n의 이러한 이진 트리의 수는 n 이진 연산자 (내부 노드를 나타내는)로 구분 된 n + 1 기호 (잎을 나타내는)의 문자열을 완전히 괄호하는 방법의 수와 같으며 각 함수 하위 식을 결정합니다. 연산자. 예를 들어 n = 3의 경우 X X와 X에서 X {디스플레이 스타일 X*X*X*X*X}와 같은 문자열을 괄호해야 하며, 이는 다섯 가지 방법으로 가능합니다: 위의 구현의 시간 복잡성은 n이 주어진 이진 트리의 노드 수인 O(n)입니다. 여기서 가정은 Add() 및 포함() 해시세트 의 메서드가 O(1) 시간에 작동한다는 것입니다. newTree를 활용하는 폭우선에서 일어나는 일을 연습해 봅시다. 레벨이 필수적인 의미를 갖지 않기 때문에 BST에서는 폭 우선이 덜 유용하지만, 이 검토를 단순화하기 위해 모든 예제에 대해 동일한 BST를 활용합니다: 적색-검은색 트리 연산은 수정된 BST 작업의 수정된 버전입니다.

작업 복잡성을 나무 높이의 함수로 유지하면서 적색 – 검은 색 나무의 특성을 보존하는 것을 목표로합니다. 왼쪽 자식이 있는 노드에 문자가 없는 오른쪽의 이진 트리로 메모리에 구현됩니다. 이진 트리에서는 두 자식이 있는 노드를 명확하게 삭제할 수 없습니다. [27] 그러나 특정 이진 트리(이진 검색 트리 포함)에서는 트리 구조를 재배열하여 이러한 노드를 삭제할 수 있습니다. 노드와 가장자리를 복제하는 동안 사전 주문 통과는 이진 트리의 완전한 복제를 만들 수 있습니다. 또한 식 트리에서 접두사 표현식(폴란드어 표기)을 만드는 데 사용할 수도 있습니다. 예를 들어, 사전 주문으로 묘사된 산술 식을 트래버스하면 “+ * 1 – 2 3 + 4 5″를 생성합니다. 트리를 트래버스하는 것은 어떤 방식으로 모든 노드를 반복하는 것입니다.

지정된 노드에서 두 개 이상의 가능한 다음 노드(선형 데이터 구조가 아님)가 있기 때문에 순차 계산(병렬이 아님)을 가정하면 일부 노드는 나중에 방문하기 위해 어떤 식으로든 저장되어야 합니다. 이 작업은 종종 스택(LIFO) 또는 큐(FIFO)를 통해 수행됩니다. 트리는 자체 참조(재귀적으로 정의된) 데이터 구조이기 때문에, 순회는 매우 자연스럽고 명확한 방식으로 재귀 또는 보다 미묘하게 코어커레이션으로 정의될 수 있습니다. 이러한 경우 지연된 노드는 호출 스택에 암시적으로 저장됩니다. 너비 우선 접근 방식은 트리의 수준에 몇 가지 의미가 있을 때 활용됩니다. 너비에서 먼저 전체 트리를 통과할 때까지 트리의 각 레벨을 위에서 아래로 방문합니다. 각 수준에서 각 노드를 왼쪽에서 오른쪽으로 한 번 방문합니다.