초보자도 한눈에 이해할 수있는 단서 바이너리 트리 데이터 구조 단서 바이너리 트리

1. 단서를 사용하는 이유

바이너리 연결 목록은 노드 직전직계 후계자를 편리하고 신속하게 찾기위한 저장 구조로 사용됩니다 . 이 동적 액세스 방법은 이진 연결 목록의 빈 체인 도메인을 최대한 활용하여 순회 프로세스에서 노드의 선행 및 후속 정보를 저장하는 것입니다.

2. 단서 바이너리 트리 노드의 구조

n 개의 노드가있는 이진 연결 목록에는 2n 개의 체인 도메인이 있습니다. 빈 체인 도메인 : n + 1, 비어 있지 않은 체인 도메인 : n-1 (두 점을 연결하는 선)

단서의 개념 이해

다른 순회 순서에 따라 사전 주문 단서 이진 트리, 중간 주문 단서 이진 트리, 후 주문 단서 이진 트리 로 나뉩니다.

3. 알고리즘 아이디어

  1. 순차 스레딩은 순차 재귀 순회 알고리즘 프레임 워크를 채택합니다.
  2. 스레드 추가 작업은 액세스 노드 작업입니다.
  3. 스레드 추가 작업은 방금 방문한 노드와 현재 노드 간의 관계를 사용해야하므로 방금 방문한 노드를 항상 기록하도록 포인터를 미리 설정하십시오.
    1. 현재 순회 노드 루트의 왼쪽 하위 도메인이 비어 있으면 왼쪽 하위 도메인이 pre를 가리 킵니다.
    2. 선행 작업의 오른쪽 하위 도메인이 비어 있으면 오른쪽 하위 도메인이 현재 순회 노드 루트를 가리 키도록합니다.
    3. 다음 시간을 준비하기 위해 현재 액세스 노드 루트가 다음 액세스 노드의 선행 작업을 수행합니다.

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;
}

추천

출처blog.csdn.net/weixin_44068262/article/details/106429603