알고리즘 시리즈 (7) 데이터 구조의 트 리 의 기본 구조 와 이 진 트 리 의 옮 겨 다 니 기
알고리즘 시리즈 (6) 데이터 구조의 표 대기 열 과 스 택 한 글 에서 데이터 구조 중의 기본 선형 데이터 구 조 를 소개 했다.대량의 데이터 에 대해 링크 접근 시간 이 너무 느 리 고 배열 삽입 삭제 시간 이 너무 느리다.우 리 는 데이터 구조 트 리 에 대해 토론 합 시다.트 리 구조의 대부분 작업 평균 실행 시간 은 O (logN) 입 니 다.
나무 정의
나 무 는 n (n > = 1) 개의 유한 노드 로 차원 관 계 를 가 진 집합 을 구성한다.
각 노드 에 0 개 이상 의 키 노드 가 있다.부모 노드 가 없 는 노드 를 뿌리 노드 라 고 한다.모든 비 근 노드 가 있 고 부모 노드 만 있 습 니 다.뿌리 노드 를 제외 하고 모든 하위 노드 는 서로 교차 하지 않 는 여러 개의 하위 나무 로 나 눌 수 있다.
3. 나무의 구조
각 노드 마다 하나의 사슬 이 형 제 를 가리 키 고 다른 사슬 은 아들 을 가리킨다.
package com.algorithm.tree;
/**
*
*
* @author chao
*
* @param <T>
*/
public class TreeNode<T> {
public T element;
public TreeNode<T> firstchild;
public TreeNode<T> nextSibling;
}
나무
매우 전형 적 인 응용 장면 은 바로 운영 체제 의 디 렉 터 리 구조 이다.
디 렉 터 리 에 있 는 모든 파일 을 찾 는 것 이 트 리 를 옮 겨 다 니 는 과정 입 니 다.이 알고리즘 도 전형 적 인 재 귀 알고리즘 으로 전형 적 인 깊이 검색 이다.
package com.algorithm.tree;
import java.io.File;
import java.util.ArrayList;
public class FindAllFile {
private ArrayList<File> files = new ArrayList<>();
public ArrayList<File> getFiles() {
return files;
}
public void findAllFiles(File file) {
if (file == null) {
return;
} else if (file.isFile()) {
files.add(file);
} else {
for (File curfile : file.listFiles()) {
findAllFiles(curfile);
}
}
}
public static void main(String[] args) {
FindAllFile filefinder = new FindAllFile();
filefinder.findAllFiles(new File("D:\\code\\git\\simplealgorithm\\bin"));
System.out.println(filefinder.getFiles());
}
}
다섯, 두 갈래 나무
이 진 트 리 는 가장 기본 적 인 나무 구조 로 모든 노드 는 왼쪽 나무 하나, 오른쪽 나무 하나 밖 에 없다.만약 그것 의 좌우 자나무 노드 가 모두 비어 있다 면, 그 는 바로 이 두 갈래 나무의 잎 노드 이다.만약 이 노드 의 아버지 노드 가 비어 있다 면, 그것 은 바로 이 나무의 뿌리 노드 이다.
6. 이 진 트 리 의 실현 과 옮 겨 다 니 기
package com.algorithm.tree;
/**
*
*
* @author chao
*
* @param <T>
*/
public class BinaryTree<T> {
private BinaryTreeNode<T> root;
public static class BinaryTreeNode<T> {
public T element;
public BinaryTreeNode<T> left;
public BinaryTreeNode<T> right;
}
public BinaryTree(BinaryTreeNode<T> root) {
this.root = root;
}
public BinaryTreeNode getRoot() {
return root;
}
/**
* LDR
*/
public void inOrderTraversal(BinaryTreeNode<T> node) {
if (node == null) {
return;
} else {
inOrderTraversal(node.left);
System.out.println(node.element);
inOrderTraversal(node.right);
}
}
/**
* DLR
*/
public void firstOrderTraversal(BinaryTreeNode<T> node) {
if (node == null) {
return;
} else {
System.out.println(node.element);
firstOrderTraversal(node.left);
firstOrderTraversal(node.right);
}
}
/**
* LRD
*/
public void lastOrderTraversal(BinaryTreeNode<T> node) {
if (node == null) {
return;
} else {
lastOrderTraversal(node.left);
lastOrderTraversal(node.right);
System.out.println(node.element);
}
}
}
이상 은 나무의 기초 입 니 다. 나무의 비 재 귀적 옮 겨 다 니 거나 층 차 를 옮 겨 다 니 며 쓰 지 않 았 습 니 다.추 후 github 에 보충 하 겠 습 니 다.
이 진 트 리 는 두 가지 라 이브 러 리 집합 류 트 리 셋 과 트 리 맵 의 기초 이 고 이 진 트 리 는 특수 한 이 진 트 리 입 니 다.나중에 설명 하 겠 습 니 다.
코드 구현 github, 주소 볼 수 있 습 니 다.https://github.com/robertjc/simplealgorithm
github 코드 도 계속 보완 되 고 있 습 니 다. 일부 부분 에 문제 가 있 을 수 있 으 니 잘 부탁드립니다.
QR 코드 스 캔 을 환영 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.