データ構造 C言語版、二分木の4つの走査方式(プリオーダー、インオーダー、ポストオーダー、レベルトラバーサル)

要約: データ構造を研究するとき、ツリーの章が間違いなく重要なポイントであり、バイナリ ツリーがツリーのキー ポイントです。バイナリ ツリーのトラバースをよく把握する必要があります。今日は、それを見てみましょう。 . バイナリ ツリーの一般的に使用される 4 つのトラバーサル。

タイトルにもありますが、二分木のトラバース手法について、それはどのように実現されているのか、前順位とは何か、中位オーダーとは何か、後順位とは何か、レベルトラバースとは何か、などについてお話します。たとえば、以下にバイナリツリーがありますので、見てみましょう。

         いわゆるプリオーダーでは、最初にルート ノードをトラバースし、次に左右の子ノードをトラバースします。

上に示したように、プリオーダー トラバーサルを使用する場合、ABCDEF GHK になります。

        順走査では、最初に左側の子ノードを走査し、次にルート ノードを走査し、最後に右側の子ノードを走査します。

上図のように、プリオーダートラバーサルを使用するとB DC AE HGK Fになります。

        事後走査では、最初に左側の子ノードを走査し、次に右側の子ノードを走査し、最後にルート ノードを走査します。

上に示したように、事後トラバーサルを使用すると、DC B HKG FE A になります。

        最後の階層トラバースは、上の図に示すように、実際には上から下、左から右へのルールに従って階層化されたトラバースです。

レベルトラバーサルを使用する場合は、A BE CF DG HK になります。

        コードの実装は次のとおりです。

ヘッダファイル(関数宣言):terr.h

#ifndef _TREE_
#define _TREE_
#define N 64
typedef char data_t;
typedef struct tree_node{
	data_t data;
	struct tree_node *l;//左孩子指针
	struct tree_node *r;//右孩子指针
}Tree;


Tree *Create_tree();//创建二叉树

void Tlr(Tree *T);//先序遍历

void lTr(Tree *T);//左序遍历

void lrT(Tree *T);//后序遍历

void C_bianli(Tree *T);//层次遍历

#endif

実装関数:terr.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>
#include "tree.h"

Tree *Create_tree()
{
	char ch;
	scanf("%c",&ch);
	Tree *T;
	if(ch == '#')
		{
		return NULL;
		}
	else
		{
		T =(Tree *)malloc(sizeof(Tree));
		if(NULL==T)
			{
			printf("T is NULL\n");
			return NULL;
			}
		T->data= ch;	
		T->l=Create_tree();//递归创建左孩子
		T->r=Create_tree();//递归创建右孩子
		
		return T;
		}
}

void Tlr(Tree *T)//先序遍历
{
	
	if(T!=NULL)
	{
		printf("%c",T->data);
		
		Tlr(T->l);//递归遍历左孩子
		Tlr(T->r);//递归遍历右孩子
	}
	return;
	
}

void lTr(Tree *T)//中序遍历
{
	
	if(T!=NULL)
	{
		
		
		lTr(T->l);
		printf("%c",T->data);
		lTr(T->r);
	}
	return;
	
}
void lrT(Tree *T)//后序遍历
{
	
	if(T!=NULL)
	{
				
		lrT(T->l);		
		lrT(T->r);
		printf("%c",T->data);
	}
	return;
	
}

void C_bianli(Tree *T)//层次遍历
{
	int front,rear;
	Tree *Q[N];
	if(T==NULL)//若为空树 则直接返回
	{
		return;
	}
	for (rear=1;rear<N;rear++)//把指针数组里的内容都赋值为空
	{
		Q[rear]=NULL;
	}
	front=rear=1;//对头指针和对尾指针
	Q[rear]=T;
	while(Q[front]!=NULL)//判断是否遍历结束
	{
		printf("%c",Q[front]->data);//打印出队内容
		if( T->l != NULL)//判断是否有左孩子
		{
			rear++;//对尾指针向后偏移
			Q[rear]=T->l;//左孩子入队
		}
		if(T->r != NULL)//判断是否有右孩子
		{
			rear++;//对尾指针向后偏移
			Q[rear]=T->r;//右孩子入队
		}
		front++;//出队一个对头指针向后偏移一个
		T=Q[front];	//把下一个元素作为新的根节点进行出入队	
	}
	return;
}

メイン関数: main.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>
#include "tree.h"

int main()
{
	Tree *T=Create_tree();//创建二叉树

	Tlr(T);//先序遍历
	puts(" ");
	lTr(T);//左序遍历
	puts(" ");
        lrT(T);//后序遍历
	puts(" ");	
	C_bianli(T);//层次遍历
	puts(" ");
	return 0;
}

良い!今日はここで共有します。初めて共有しますが、文章が間違っている箇所はあります。修正を歓迎します。遠慮せずに教えてください。

おすすめ

転載: blog.csdn.net/weixin_56187542/article/details/126128998