네 이진 트리 탐색 알고리즘

이제 이러한 이진 트리가있다 :
그림 삽입 설명 여기

예약 주문

아이디어와 코드

노드, 왼쪽 서브 트리, 탐색 바로 하위 트리의 순서 :에 따르면

void PriorOrder(BTNode* b) 
{
	if(b)
	{
		printf("%c", b->data);
		PriorOrder(b->lchild);
		PriorOrder(b->rchild);	
	}
} 

분석을 처리

처음에, 우리는 먼저 맨 위의 나무 (빨간색 상자)을 통과합니다
파란색 박스 원 루트, 왼쪽 서브 트리 각각 우측 하위 트리, 세 부분으로이 숫자
우리가 처음 액세스 노드 A를 다음 전체적으로 파란색 상자의 왼쪽에있는 왼쪽 서브 트리를 방문
그림 삽입 설명 여기

그림 삽입 설명 여기
이제 동일 도면 이루어지는 좌측 서브 트리를 분리 : 제 구경 B가, 그 왼쪽 노드 D를 방문하고 적절한 서브 트리를 참조.
그림 삽입 설명 여기
우리는 다음 오른쪽 하위 트리 제기 : 그때나 지금이나 여전히 액세스 E H에 동일한 다음 액세스를 시작과 ABC의 개수로 구성된 왼쪽 서브 트리의 루트 노드는 이제 ABC 방송의 오른쪽 노드 번호를 액세스하기 시작 이상 방문
그림 삽입 설명 여기
트리의 ABC 권리 노드 :
그림 삽입 설명 여기
위와 동일, 액세스 할 수 있습니다.
최종 액세스 순서 : ABDEHCFIJG

예약 주문

아이디어와 코드

에 따르면 위해서는 노드,이 노드를 마우스 오른쪽 노드 통과를 남겨

void InOrder(BTNode* b) 
{
	if(b)
	{
		InOrder(b->lchild);
		printf("%c", b->data);
		InOrder(b->rchild);	
	}
} 

이 과정은 왼쪽 하위 트리가 최초의 완전한 방문하는 것을 제외하고, 여전히 상기와 동일합니다.
출력 순서 : DBHEAFJICG

후속 탐색

아이디어와 코드

왼쪽 노드를 마우스 오른쪽 노드,이 노드 탐색 순서 :에 따르면


void PostOrder(BTNode* b) 
{
	if(b)
	{
		PostOrder(b->lchild);
		PostOrder(b->rchild);
		printf("%c", b->data);	
	}
} 

출력 순서 : DHEBJIFGCA

수준을 트래버스

아이디어와 코드

에 따르면, 루트 제 1 층, 제 2 층의 순회 순서 ...

void LevelTraversal(BTNode* b)
{
	if(b)
	{
		//定义队列 
		BTNode* queue[MaxSize];
		int top=0;
		queue[top] = b;
		int i = 0;
		
		//只要队列里有元素 
		while(i<=top)
		{
			//将左右子树加入队列 
			if(queue[i]->lchild)
			{
				top++;
				queue[top] = queue[i]->lchild;	
			}
			if(queue[i]->rchild)
			{
				top++;
				queue[top] = queue[i]->rchild;	
			}
			i++;
		}

		//现在这个队列按层次顺序容纳了二叉树的每个节点	
		for(i=0;i<=top;i++)
		{
			//挨个打出来即可 
			printf("%c", queue[i]->data);
		}			
		//我比较懒所以就没写出队,这其实当成个栈也可以 
	}  			
} 

그것은 접근 한 수준은 분명하다, 순서는 ABCDEFGHIJ입니다

게시 33 개 원래 기사 · 원의 찬양 (40) · 전망 3549

추천

출처blog.csdn.net/qq_43948583/article/details/104399020