이진트리 예제

By Dave Sanasack, on Aug, 02 2019

$$data = 5$$$가 있는 노드의 왼쪽 및 오른쪽 하위 트리가 모두 완전히 처리되었습니다. 따라서 순서(5)가 완료됩니다. 여기에 표시된 솔루션은 단일 노드를 빌드하는 newNode() 도우미 기능을 소개합니다. 기본 대/소문자/재귀 구조는 lookup() 구조와 유사합니다. 보다 정교한 간결한 표현을 사용하면 나무를 컴팩트하게 보관할 수 있을 뿐만 아니라 간결한 형태로 작업하는 동안 직접 나무를 직접 작업할 수 있습니다. /** 지정된 대상이 이진 트리에 있는 경우 true를 반환합니다. 재귀 도우미를 사용합니다. */ 공개 부울 조회(int 데이터) { return(조회(루트, 데이터)); } 이 문서에서는 트리와 이진 트리 간의 차이점에 대해 설명합니다. 우리는 또한 이진 나무의 종류와 그들과 관련된 인터뷰 질문의 일부에 대해 논의 할 것입니다. 이진 트리는 모든 노드가 가장 두 개의 자식을 가지는 정렬된 트리(평면 트리라고도 있음)인 루팅된 트리입니다. 뿌리 트리는 자연스럽게 레벨 개념(루트로부터의 거리)을 부여하므로 모든 노드에 대해 자식의 개념은 아래 레벨에 연결된 노드로 정의될 수 있습니다.

이러한 자식(예: 평면에 그리기)을 정렬하면 왼쪽 자식과 오른쪽 자식을 구별할 수 있습니다. [13] 그러나 이것은 여전히 왼쪽이 있지만 오른쪽자식이 아닌 오른쪽 자식이 있는 노드를 구별하지 는 않습니다. /* –Node– 이진 트리는 이 중첩노드 클래스를 사용하여 빌드됩니다. 각 노드는 하나의 데이터 요소를 저장하며 null일 수 있는 왼쪽 및 오른쪽 하위 트리 포인터가 있습니다. 노드는 “멍청한” 중첩 클래스입니다 . 메서드가 없습니다. */ 개인 정적 클래스 노드 { 노드 왼쪽; 노드 오른쪽; int 데이터; /* 이진 검색 트리와 숫자를 지정하고 트리의 올바른 위치에 지정된 번호가 있는 새 노드를 삽입합니다. 호출자 다음 사용 해야 하는 새 루트 포인터를 반환 합니다 (참조 매개 변수를 사용 하지 않도록 하는 표준 트릭). */ 구조형 노드* 삽입(구조형 노드* 노드, int 데이터) { // 1. 트리가 비어 있는 경우 새 단일 노드(노드 == NULL) { return(newNode(데이터)) } else {// 2를 반환합니다. 그렇지 않으면 (데이터 데이터) 노드->왼쪽 = insert(node->왼쪽, 데이터)가 트리를 다시 입력합니다.

else 노드->오른쪽 = 삽입(노드-오른쪽, 데이터); 자바에서는 단일 루트 포인터가 포함 된 BinaryTree 개체가 있습니다. 루트 포인터는 C/C++ 버전의 노드 구조체처럼 행동하는 내부 노드 클래스를 가리킵니다. 노드 클래스는 비공개입니다 – BinaryTree 내부 저장소에만 사용되며 클라이언트에 노출되지 않습니다. 이 OOP 구조를 사용하면 거의 모든 작업에는 계산을 시작하는 BinaryTree의 한 줄 메서드와 노드 개체에서 작동하는 재귀 메서드의 두 가지 방법이 있습니다. 조회() 작업의 경우 클라이언트가 조회 작업을 시작하는 데 사용하는 BinaryTree.lookup() 메서드가 있습니다. BinaryTree 클래스 내부에는 노드 구조 아래로 재귀 변환을 구현하는 개인 재귀 조회(Node) 메서드가 있습니다. 이 두 번째 개인 재귀 방법은 기본적으로 위의 재귀 C/C++ 함수와 동일합니다. 순서가 맞지 않는 순회는 먼저 왼쪽 하위 트리를 방문한 다음 루트 노드를 방문한 다음 마지막으로 오른쪽 하위 트리로 구성됩니다. 설명은 복잡하지만 코드는 간단합니다. 예를 들어 노드가 `+`와 같은 작업이고 하위 트리가 재귀적으로 `+`에 대한 두 하위 식인 식 트리를 평가하는 데 사용되는 일종의 상향식 탐색입니다. 하위 트리 자체가 정상 반환(isBST(node.left) 및 isBST(node.right))인지 확인합니다. } 이 문제의 경우 이러한 경로 값의 합계(예: 5-4-11-7 경로의 값 합계는 5 + 4 + 11 + 7 = 27)에 대해 염려합니다.