四バイナリツリートラバーサルアルゴリズム

さて、このようなバイナリツリーがあります:
ここに画像を挿入説明

予約限定!

アイデアとコード

ノード、左の部分木、トラバーサル右部分木の順序:によると、

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

プロセス分析

まず、我々は最初の最上位ツリー(赤いボックス)を横断する
それぞれのルート、左サブツリー、右の部分木、青いボックスで囲んだ:この数は三つの部分に
我々第1のアクセスノード・Aその後、全体として青色のボックスで、左側にある左のサブツリーを、訪れ
Aここに画像を挿入説明

ここに画像を挿入説明
右サブツリーを訪問し、左側のノード、Dを訪問し、その後、最初の訪問B:今、ビューからなる左サブツリーを分離同じです。
ここに画像を挿入説明
ABCの右ノード番号にアクセスするために開始し、その後、今、始まりとABCの数からなる左の部分木のルートノードが今、以上訪問している、アクセスE Hへのアクセス、その後、まだ同じ:私たちは、その後、右のサブツリーを提起しました
ここに画像を挿入説明
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

レベルをトラバース

アイデアとコード

よると:ルート、第一層、第二層トラバーサルの順序...

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