내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
기본 데이터 구조 | 관련 지식 포인트 | 클릭하시면 됩니다 | 아래 링크에서 배워보세요 | 함께 열심히! |
---|---|---|---|---|
시간과 공간의 복잡성에 대한 심층 분석 | 시퀀스 테이블의 심층 분석: 기본 논리 탐색 | 단일 연결 목록의 심층 분석: 기본 논리 탐색 | 주요 양방향 순환 연결 목록에 대한 심층 분석: 기본 논리 탐색 | 스택 심층 분석: 기본 논리 탐색 |
대기열 심층 분석: 기본 논리 탐색 | 순환 대기열에 대한 심층 분석: 기본 논리 탐색 |
이 기사는 이진 트리에 대해 더 자세히 배울 수 있도록 트리 및 이진 트리와 관련된 개념부터 시작합니다.
🌈个人主页:웨이터야
🌈C语言笔记专栏:C 언어 노트
🌈C++笔记专栏: C++ 노트
🌈初阶数据结构笔记专栏: 기본 데이터 구조 참고사항
🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅
트리는 다음과 같은 비선형 데이터 구조입니다.n(n>=0)
제한된 노드는 계층적 관계를 갖는 집합을 형성합니다. 그러나 트리는 실제로는 가치가 거의 없지만 이진 트리는 실용적인 가치가 더 큽니다(이 집합을 트리라고 부르는 이유는 루트가 위로 향하고 잎이 있기 때문입니다). 아래를 향하고 있습니다. 나무처럼 보입니다.)
M(M>0)
서로소 집합T1、T2、....、Tm
, 각 세트는Ti(1<=i<=m)
트리와 유사한 구조를 가진 또 다른 하위 트리입니다. 각 하위 트리의 루트 노드에는 단 하나의 선행 노드가 있고 0개 이상의 후속 노드가 있을 수 있습니다.트리 구조는 선형 테이블보다 복잡하기 때문에 저장 방법이 더 까다롭습니다. 값 범위와 노드 간의 관계를 모두 저장해야 합니다.
이전 지식을 바탕으로 한 몇 가지 방법은 다음과 같습니다.
typedef int DataType;
struct Node
{
struct Node* _firstChild1; // 第一个孩子结点
struct Node* _pNextBrother; // 指向其下一个兄弟结点
DataType _data; // 结点中的数据域
};
물론, 위의 방법에 국한되지 않고 부모 표현, 자식 표현, 자식 부모 표현, 자식 형제 표현 등도 있습니다.여기서 우리는 가장 일반적으로 사용되는 것들을 간략하게 이해하겠습니다남동생 대표
이진 트리는 유한한 노드 집합입니다. 이 집합에는 두 가지 상황이 있을 수 있습니다.
그림에서 두 가지 결론을 도출할 수 있습니다.:
이진 트리에는 차수가 2보다 큰 노드가 없습니다.
이진 트리의 하위 트리는 왼쪽 하위 트리와 오른쪽 하위 트리로 나눌 수 있고 순서는 바뀔 수 없으므로 이진 트리는 순서 트리입니다.
알아채다: 모든 이진 트리의 경우 다음과 같은 상황으로 구성됩니다(빈 나무 상황은 잊기 가장 쉽다)
간략하게 요약하자면:
전체 이진 트리의 모든 수준이 가득 찼습니다.
완전한 이진 트리의 높이가 n이면 첫 번째 n-1 수준은 가득 차 있지만 마지막 수준은 가득 차지 않을 수 있습니다.하지만 왼쪽에서 오른쪽으로 연속되어야 합니다.
완전 이진 트리는 매우 효율적인 데이터 구조이고, 완전 이진 트리는 완전 이진 트리의 특별한 유형입니다.
완전 이진 트리는 완전 이진 트리의 필요충분조건입니다.
이것은 왼쪽에서 오른쪽으로 연속되지 않는 일반적인 이진 트리입니다.
이진 트리는 일반적으로 두 가지 구조로 저장될 수 있습니다. 하나는 순차 구조이고 다른 하나는 체인 구조입니다.
순차 구조 저장은 배열을 사용하여 저장하는 것입니다.일반적으로 배열은 완전한 이진 트리를 나타내는 데에만 적합합니다. , 바이너리 트리가 가득 차지 않으면 공간 낭비가 발생하기 때문입니다. 실제로는 힙만 저장을 위해 배열을 사용합니다. 이진 트리의 순차 저장은 물리적으로는 배열이고 논리적으로는 이진 트리입니다. 다음 질문을 해결하려면 물리적 배열과 논리적 이진 트리의 조합을 사용하여 문제를 해결해야 합니다.
leftchild = parent * 2 + 1;
rightchild = paretn * 2 +2;
parent = (child - 1) / 2;
(왼쪽 자식과 오른쪽 자식을 구분하지 않음)
세 번째 사항에 대해서는 개인적인 추론을 바탕으로leftchild
아래 첨자는 다음과 같이 분할됩니다.leftchild- 1
그리고1
,을 위한leftchild-1
~을 위한parent
아래 첨자를 두 번,(child - 1) / 2
운영자는leftchild
그대로 꺼내세요1
부분적으로 2로 나눈 정수는 0이고,leftchild -1
그 일부는 다음과 같이 볼 수 있다.leftchild
,그리고rightchild与leftchild相差1
,왜냐하면rightchild = leftchild - 1
그리고 위를 통해서leftchild - 1 ~= leftchild
, 라고 추론할 수 있다.rightchild = leftchild(在进行/2运算,取整数情况下)
이진 트리의 연결 저장 구조는 연결 리스트를 사용하여 이진 트리를 표현하는 것을 의미합니다. 즉, 체인을 사용하여 요소의 논리적 관계를 나타냅니다. 일반적인 방법은 연결된 목록의 각 노드가 데이터 필드와 왼쪽 및 오른쪽 포인터 필드의 세 가지 필드로 구성된다는 것입니다. 왼쪽 및 오른쪽 포인터는 왼쪽 자식과 오른쪽 자식이 있는 링크 지점의 저장 주소를 제공하는 데 사용됩니다. 노드의 위치는 각각 다릅니다.체인 구조는 이진 체인과 삼중 체인으로 구분됩니다. 현재 우리 연구에서는 이진 체인을 일반적으로 사용하지만 나중에 레드-블랙 트리와 같은 고차 데이터 구조를 배울 때 삼중 체인이 사용됩니다.
typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{
struct BinTreeNode* _pLeft; // 指向当前节点左孩子
struct BinTreeNode* _pRight; // 指向当前节点右孩子
BTDataType _data; // 当前节点值域
}
// 三叉链
struct BinaryTreeNode
{
struct BinTreeNode* _pParent; // 指向当前节点的双亲
struct BinTreeNode* _pLeft; // 指向当前节点左孩子
struct BinTreeNode* _pRight; // 指向当前节点右孩子
BTDataType _data; // 当前节点值域
};
순차 구조 저장소는 배열을 통해 저장됩니다.일반적으로 배열은 완전한 이진 트리에만 적합하고, 불완전한 이진 트리는 배열 구조 저장에 적합하지 않습니다. . 하지만 실제로 배열은 힙을 사용할 때만 저장용으로 사용되며, 대부분 체인 구조를 통해 저장됩니다.
그 이유는:
이상이 이 글의 내용입니다. 읽어주신 모든 분들께 감사드립니다. 다음은 기본 데이터 구조에 대한 Dian Xiaoer의 노트입니다. 기본 데이터 구조를 학습하는 데 도움이 되기를 바랍니다.