1. 단서를 사용하는 이유
바이너리 연결 목록은 노드 의 직전 및 직계 후계자를 편리하고 신속하게 찾기위한 저장 구조로 사용됩니다 . 이 동적 액세스 방법은 이진 연결 목록의 빈 체인 도메인을 최대한 활용하여 순회 프로세스에서 노드의 선행 및 후속 정보를 저장하는 것입니다.
2. 단서 바이너리 트리 노드의 구조
n 개의 노드가있는 이진 연결 목록에는 2n 개의 체인 도메인이 있습니다. 빈 체인 도메인 : n + 1, 비어 있지 않은 체인 도메인 : n-1 (두 점을 연결하는 선)
단서의 개념 이해
다른 순회 순서에 따라 사전 주문 단서 이진 트리, 중간 주문 단서 이진 트리, 후 주문 단서 이진 트리 로 나뉩니다.
3. 알고리즘 아이디어
- 순차 스레딩은 순차 재귀 순회 알고리즘 프레임 워크를 채택합니다.
- 스레드 추가 작업은 액세스 노드 작업입니다.
- 스레드 추가 작업은 방금 방문한 노드와 현재 노드 간의 관계를 사용해야하므로 방금 방문한 노드를 항상 기록하도록 포인터를 미리 설정하십시오.
- 현재 순회 노드 루트의 왼쪽 하위 도메인이 비어 있으면 왼쪽 하위 도메인이 pre를 가리 킵니다.
- 선행 작업의 오른쪽 하위 도메인이 비어 있으면 오른쪽 하위 도메인이 현재 순회 노드 루트를 가리 키도록합니다.
- 다음 시간을 준비하기 위해 현재 액세스 노드 루트가 다음 액세스 노드의 선행 작업을 수행합니다.
4. 중간 순서 단서의 이진 트리 구축
핵심 알고리즘
5. 완전한 코드
#include <stdio.h>
#include <stdlib.h>
typedef struct BiNode
{
char data;
int Ltag;
int Rtag;
struct BiNode * LChild;
struct BiNode * RChild;
}BiNode,*BiTree;
BiTree pre; //全局定义前驱指针
//创建二叉树,按先序遍历输入
void CreateBiTree(BiTree *T)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
*T=NULL;
else{
*T=(BiTree) malloc (sizeof(BiNode));
(*T)->data=ch;
CreateBiTree(&(*T)->LChild);
CreateBiTree(&(*T)->RChild);
}
}
//中序线索化
void Inthread (BiTree root)
{
if (root !=NULL )
{
Inthread(root->LChild);//线索化左子树
printf(" %c ",root->data);
if (root->LChild==NULL) //找前驱
{
root->Ltag=1;
root->LChild=pre;
}
if (pre !=NULL && pre->RChild == NULL) //找后继
{
pre->RChild=root;
pre->Rtag=1;
}
pre=root; //让当前结点作为下一次的前驱
Inthread(root->RChild);//线索化右子树
}
}
int main()
{
BiTree T;
printf("请按照先序遍历的方式输入(为空是输入#): ");
CreateBiTree(&T);
printf("中序线索化: ");
Inthread(T);
printf("\n");
return 0;
}