트리
두 갈래 나무는 노드마다 최대 두 그루의 나무가 있는 나무 구조다.보통 자목은'좌자수'와'우자수'라고 불린다.두 갈래 나무는 두 갈래 찾기 나무와 두 갈래 더미를 실현하는 데 자주 쓰인다.두 갈래 나무의 관련 성질: 두 갈래 나무의 매 결점은 기껏해야 두 그루의 나무(2보다 큰 결점은 존재하지 않는다), 두 갈래 나무의 자나무는 좌우의 구분이 있기 때문에 순서가 뒤바뀌어서는 안 된다.두 갈래 나무의 i층에는 2^(i-1)개의 결점이 있다.깊이가 k인 두 갈래 나무는 기껏해야 2^k-1개의 결점이 있다.한 그루의 깊이가 k이고 2^k-1개의 노드가 있는 두 갈래 나무를 만 두 갈래 나무라고 부른다.깊이는 k이고 n개의 노드가 있는 두 갈래 나무는 모든 노드가 깊이가 k인 만 갈래 나무에 있고 번호가 1부터 n까지의 노드에 대응할 때만 완전 두 갈래 나무라고 부른다.
두 갈래 나무의 세 가지 역행 방법: 두 갈래 나무의 일부 응용에서 나무에서 특정한 특징을 가진 노드를 찾거나 나무의 모든 노드를 처리하도록 요구하는데 이것은 두 갈래 나무의 역행과 관련된다.두 갈래 나무는 주로 세 개의 기본 단원으로 구성되어 있는데 뿌리 노드, 왼쪽 나무와 오른쪽 나무이다.만약 선좌후우를 한정한다면 이 세 부분의 역행 순서에 따라 선차역행, 중차역행과 후속역행 세 가지로 나눌 수 있다.
(1) 두 갈래 나무가 비어 있으면 비어 있다. 그렇지 않으면 뿌리 노드에 접근하고 왼쪽 나무를 먼저 훑어보고 오른쪽 나무를 먼저 훑어본다.(2) 두 갈래 나무가 비어 있으면 비어 있다. 그렇지 않으면 왼쪽 나무를 중순으로 훑어보고 뿌리 노드를 방문하고 마지막으로 오른쪽 나무를 중순으로 훑어본다.(3) 두 갈래 나무가 비어 있으면 빈 동작을 한다. 그렇지 않으면 앞뒤로 왼쪽 트리를 훑어보고 뿌리 노드를 방문하고, 그 다음에 오른쪽 트리를 훑어보고 마지막으로 뿌리 노드를 방문한다.
두 갈래 찾기 트리는 두 갈래 정렬 트리로 두 갈래 검색 트리라고도 부른다.두 갈래는 나무나 빈 나무 또는 다음과 같은 성질을 가진 두 갈래 나무를 찾는다. (1) 왼쪽 나무가 비어 있지 않으면 왼쪽 나무의 모든 결점의 값이 뿌리 결점의 값보다 작다.(2) 오른쪽 트리가 비어 있지 않으면 오른쪽 트리의 모든 결점의 값이 뿌리 결점의 값보다 크다.(3) 왼쪽, 오른쪽 나무도 각각 두 갈래 정렬 나무이다.(4) 키 값이 같은 결점이 없다.
n개의 노드를 포함하는 두 갈래 찾기 트리의 평균 찾기 길이는 나무의 형태와 관계가 있다.최악의 경우 선후로 삽입된 키워드가 질서정연할 때 구성된 두 갈래 찾기 트리는 단일 트리로 탈바꿈하고 나무의 깊이는 n으로 그 평균 찾기 길이(n+1)/2(순서 찾기와 동일), 가장 좋은 상황은 두 갈래 찾기 트리의 형태와 반절절 찾기 판정 트리가 같고 그 평균 찾기 길이는log2(n)와 정비례한다.평균 상황에서 두 갈래 찾기 트리의 평균 찾기 길이와logn은 같은 수량급이기 때문에 더 좋은 성능을 얻기 위해 보통 두 갈래 찾기 트리의 구축 과정은'균형화 처리'를 해야 한다. 이후에 우리는 균형 두 갈래 트리와 붉은색 검은 나무를 소개할 것이다. 이런 것들은 모두 찾기 트리의 높이를 O(log(n)로 할 수 있다.
//
class TreeNode {
E element;
TreeNode left;
TreeNode right;
public TreeNode(E e) {
element = e;
}
}
두 갈래 찾기 트리의 세 가지 반복은 모두 직접 귀속적인 방법으로 실현할 수 있다.
//
protected void preorder(TreeNode root) {
if (root == null)
return;
System.out.println(root.element + " ");
preorder(root.left);
preorder(root.right);
}
//
protected void inorder(TreeNode root) {
if (root == null)
return;
inorder(root.left);
System.out.println(root.element + " ");
inorder(root.right);
}
//
protected void postorder(TreeNode root) {
if(root == null)
return;
postorder(root.left);
postorder(root.right);
System.out.println(root.element + " ");
}
두 갈래 찾기 트리의 간단한 구현:
public class BST> {
private TreeNode root;
//
public BST() {
}
//
public boolean search(E e) {
TreeNode current = root;
while (current != null) {
if (e.compareTo(current.element) < 0) {
current = current.left;
}
else if (e.compareTo(current.element) > 0) {
current = current.right;
}
else {
return true;
}
}
return false;
}
//
public boolean insert(E e) {
if (root == null) {
root = creatNewNode(e);
}
else {
TreeNode parent = null;
TreeNode current = root;
while (current != null) {
if (e.compareTo(current.element) < 0) {
parent = current;
current = current.left;
}
else if (e.compareTo(current.element) > 0) {
parent = current;
current = current.right;
}
else {
return false;
}
}
//
if (e.compareTo(parent.element) < 0) {
parent.left = creatNewNode(e);
}
else {
parent.right = creatNewNode(e);
}
}
return true;
}
//
protected TreeNode creatNewNode(E e) {
return new TreeNode(e);
}
}
//
class TreeNode> {
E element;
TreeNode left;
TreeNode right;
public TreeNode(E e) {
element = e;
}
}
균형 두 갈래 나무는 AVL 나무라고도 부른다. 그것은 빈 나무이거나 다음과 같은 성질을 가진 두 갈래 나무이다. 그의 왼쪽 나무와 오른쪽 나무는 모두 균형 두 갈래 나무이고 왼쪽 나무와 오른쪽 나무의 깊이 차이의 절대치는 1을 넘지 않는다.AVL 트리는 가장 먼저 발명된 자평형 두 갈래 찾기 트리 알고리즘이다.AVL의 모든 노드에 있는 두 아들 나무의 높이의 최대 차이는 1이기 때문에 고도 균형 나무라고도 부른다. n개의 결점의 AVL 나무의 최대 깊이는 약 1.44log2n이다.찾기, 삽입, 삭제는 평균과 최악의 경우 모두 O(logn)입니다.추가와 삭제는 트리를 한 번 또는 여러 번 회전해서 다시 균형을 잡아야 할 수도 있습니다.빨간색과 검은색 나무는 균형 두 갈래 나무의 일종으로 최악의 상황에서 기본적인 동적 집합 조작의 사건 복잡도를 O (logn) 로 보장한다.붉은색 나무와 균형 두 갈래 나무의 차이는 다음과 같다. (1) 붉은색 나무는 완전한 균형을 추구하는 것을 포기하고 대체적인 균형을 추구한다. 균형 두 갈래 나무의 시간 복잡도와 차이가 크지 않은 상황에서 매번 삽입할 때마다 최대 세 번의 회전만 하면 균형을 이룰 수 있고 실현하는 것도 더욱 간단하다.(2) 밸런스 트리는 절대 밸런스를 추구하고 조건이 까다로우며 실현하기가 번거로우며 매번 새 노드를 삽입한 후 회전해야 하는 횟수는 예측할 수 없다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.