バイナリツリートラバーサルPTA(詳細)

この問題は、バイナリツリートラバーサルの4種類を設定する必要があります。

関数インタフェースの定義:

void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );

ここで次のようにBinTree構造が定義されています。

typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

これは、空白文字の書式が続く、4つの機能は、ノードのコンテンツにアクセスするために印刷されている必要があり。

審判のテストプログラムの例:

#include <stdio.h>
#include <stdlib.h>

typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

BinTree CreatBinTree(); /* 实现细节忽略 */
void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );

int main()
{
    BinTree BT = CreatBinTree();
    printf("Inorder:");    InorderTraversal(BT);    printf("\n");
    printf("Preorder:");   PreorderTraversal(BT);   printf("\n");
    printf("Postorder:");  PostorderTraversal(BT);  printf("\n");
    printf("Levelorder:"); LevelorderTraversal(BT); printf("\n");
    return 0;
}
/* 你的代码将被嵌在这里 */

サンプル出力(図のツリーは、与えられました):

ここに画像を挿入説明

Inorder: D B E F A G H C I
Preorder: A B D F E C G H I
Postorder: D E F B H G I C A
Levelorder: A B C D F G I E H

コード:

void InorderTraversal( BinTree BT )//中序遍历 
{
	if(BT)
	{
		InorderTraversal(BT->Left);
		printf(" %c",BT->Data);
		InorderTraversal(BT->Right);
	}
}
void PreorderTraversal( BinTree BT )//先序遍历 
{ 
	if(BT)
	{
		printf(" %c",BT->Data);
		PreorderTraversal(BT->Left);	
		PreorderTraversal(BT->Right);
	}
}
void PostorderTraversal( BinTree BT )//后续遍历 
{
	if(BT)
	{
		PostorderTraversal(BT->Left);	
		PostorderTraversal(BT->Right);
		printf(" %c",BT->Data);
	}
}
void LevelorderTraversal( BinTree BT ) //层序遍历
{
    BinTree p;   //定义结构体变量 
    BinTree q[20];//定义结构体数组,注意数组空间大小要适合
    int m=0,n=0; 
    if(!BT) return 0;
    else  //如果数不为空 
    {
        q[n++]=BT;
        while(m!=n)
        {
        	p=q[m++];
    		printf(" %c",p->Data);
    		if(p->Left!=NULL) q[n++]=p->Left;
    		if(p->Right!=NULL) q[n++]=p->Right;
    		//先将左右子树存放到数组中 ,再输出
    	}
  	}
}

:トラバーサル配列解析考え
ここに画像を挿入説明
分析:黒三角は、P = Q、Pの意味を表す[Mを++ ]、 pは、ルートノードへのアクセス、ルート・ノードかどうかが判定された場合の順序がアクセスバイナリツリーであることが分かるで左及び右サブツリー左右のサブツリーをP、配列Qに時系列に格納され、背面にアクセスするために、各アクセス構成要素は、それが左右のサブツリーの存在であるか否かを判断するように存在する場合、問題が存在し、それがあろう左と右の順に格納されているQのサブツリー、そのように、約つのアクセスノードとアレイQの記憶素子の特性が整列されるように、保存された配列の順序の次数pとして、左後に場合p接合アクセスM = N、すべてのノードがバイナリアクセスが終了した時点、すなわち、Qが二分木構造のアレイ配列に格納されている場合。
ここに画像を挿入説明

おすすめ

転載: blog.csdn.net/qq_44256227/article/details/89892069