데이터 구조의 '이 진 트 리'
5156 단어 데이터 구조 와 알고리즘데이터 구조
이 진 트 리 는 이 진 트 리 나 이 진 트 리 라 고도 합 니 다. 빈 트 리 이거 나 다음 과 같은 몇 가 지 를 만족 시 킵 니 다. 1. 임의의 노드 의 왼쪽 트 리 가 비어 있 지 않 으 면 왼쪽 트 리 의 모든 노드 의 값 은 뿌리 노드 의 값 보다 작 습 니 다.2. 임의의 노드 의 오른쪽 하위 트 리 가 비어 있 지 않 으 면 오른쪽 하위 트 리 의 모든 노드 의 값 이 뿌리 노드 의 값 보다 크다.3. 임의의 노드 의 왼쪽, 오른쪽 트 리 도 각각 이 진 트 리 로 나 뉜 다.4. 키 가 같은 노드 가 없습니다.
두 갈래 검색 트 리 의 실현
1. 두 갈래 검색 트 리 의 저장 구조
public class BinarySearchTree {
public static Node root;
public BinarySearchTree(){
this.root = null;
}
}
class Node{
int data;
Node left;
Node right;
public Node(int data){
this.data = data;
left = null;
right = null;
}
}
2. 이 진 트 리 의 삽입 a. 2 분 반복 해서 삽입 할 곳 을 찾 습 니 다.b. 삽 입 된 값 이 현재 값 보다 적 고 현재 왼쪽 노드 가 비어 있 으 면 왼쪽 노드 는 새 노드 를 가리킨다.c. 만약 에 삽 입 된 값 이 현재 의 값 보다 크 고 현재 오른쪽 노드 가 비어 있다 면 오른쪽 노드 는 새로운 노드 를 가리킨다.
public void insert(int id){
Node newNode = new Node(id);
if(root == null){
root = newNode;
return;
}
Node current = root;
Node parent = null;
while(true){
parent = current;
if(id < current.data){
current = current.left;
if(current == null){
parent.left = newNode;
return;
}
} else {
current = current.right;
if(current == null){
parent.right = newNode;
return;
}
}
}
}
3. 이 진 트 리 의 삭제 a. 노드 를 잎 노드 로 삭제 할 때 노드 를 직접 삭제 합 니 다.b. 노드 가 왼쪽 트 리 만 삭제 할 때 왼쪽 트 리 를 다시 연결 합 니 다.c. 노드 가 오른쪽 하위 트 리 만 삭제 할 때 오른쪽 하위 트 리 를 다시 연결 합 니 다.d. 노드 를 삭제 할 때 왼쪽 트 리 도 있 고 오른쪽 트 리 도 있 을 때 삭제 노드 를 교체 할 수 있 는 노드 를 찾 습 니 다.이 진 트 리 의 성질 로 인해 왼쪽 나무의 값 은 뿌리 노드 의 값 보다 작고 오른쪽 나무의 값 은 뿌리 노드 의 값 보다 크다.그래서 오른쪽 트 리 의 가장 왼쪽 노드 는 삭 제 된 노드 를 교체 한 다음 에 오른쪽 트 리 를 다시 연결 하 는 것 이다.제 d 점 의 그림 예:
public boolean delete(int id) {
Node parent = root;
Node current = root;
boolean isLeftChild = false;
while (current.data != id) {
parent = current;
if (current.data > id) {
isLeftChild = true;
current = current.left;
} else {
isLeftChild = false;
current = current.right;
}
if (current == null) {
return false;
}
}
// ,
if (current.left == null && current.right == null) {
if (current == root) {
root = null;
}
if (isLeftChild == true) {
parent.left = null;
} else {
parent.right = null;
}
}
//
else if (current.right == null) {
if (current == root) {
root = current.left;
} else if (isLeftChild) {
parent.left = current.left;
} else {
parent.right = current.left;
}
}
//
else if (current.left == null) {
if (current == root) {
root = current.right;
} else if (isLeftChild) {
parent.left = current.right;
} else {
parent.right = current.right;
}
}
// ,
else if (current.left != null && current.right != null) {
//
Node successor = getSuccessor(current);
if (current == root) {
root = successor;
} else if (isLeftChild) {
parent.left = successor;
} else {
parent.right = successor;
}
successor.left = current.left;
}
return true;
}
public Node getSuccessor(Node deleleNode) {
Node successsor = null;
Node successsorParent = null;
Node current = deleleNode.right;
while (current != null) {
successsorParent = successsor;
successsor = current;
current = current.left;
}
if (successsor != deleleNode.right) {
successsorParent.left = successsor.right;
successsor.right = deleleNode.right;
}
return successsor;
}
4. 이 진 트 리 찾기
public boolean find(int id) {
Node current = root;
while (current != null) {
if (current.data == id) {
return true;
} else if (current.data > id) {
current = current.left;
} else {
current = current.right;
}
}
return false;
}
총결산
이것 은 질서 있 는 나무 이기 때문에 반 으로 나 누 어 찾 을 수 있 습 니 다. 매번 찾 을 때마다 일치 하 는 값 이 아니라면 반 의 값 을 제거 할 수 있 습 니 다.그래서 일반적인 시간 복잡 도 는 O (log n) 이다.만약 에 이 나무 가 경사 나무 로 퇴화 한다 면 선형 표 가 많 지 않 을 것 이다. 그의 시간 복잡 도 는 바로 O (n) 이다.
이 진 트 리 의 최 악의 시간 복잡 도 는 O (n) 이지 만 일부 개선 을 통 해 최 악의 시간 복잡 도 를 O (log n) 로 낮 출 수 있다. 예 를 들 어 AVL 트 리, 빨 간 검 은 나무 등 이다.빨간색 과 검은색 나 무 는 절대적 인 균형 이 필요 하지 않 기 때문에 삽입 과 삭제 효율 이 높 아야 한다. JDK 1.8 에서 해시 표 에 8 개 노드 이상 저장 되 어 있 는 링크 는 바로 사용 하 는 빨간색 과 검은색 나무 이다.
그래서 이 진 트 리 는 검색 에 있어 서 매우 빠 르 고 높 은 조회 효율 이 필요 할 때 추천 합 니 다.
PS: 청산 녹 수 는 먼지 에서 시작 되 고 박학 다 식 은 근면 보다 비싸다.저 술 있어 요. 사연 있어 요?위 챗 공식 번호: "먼지 제거 잡담".코드 에 대해 이야기 하 는 것 을 환영 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[JAVA] 배열 회전 출력요소 가 출력 을 시작 하 는 위치 에 주의 하 십시오. 모두 몇 라운드 의 수출 이 있 습 니까? n/2 + 1 매 라 운 드 는 상, 우, 하, 좌 로 나 뉜 다. 각 방향의 시작 위치 와 좌표 의 관 계 를 구...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.