二叉樹的層序遍歷

如果想讓二叉樹實現層序遍歷並進行打印的話,我們需要用到一個隊列的性質。隊列因爲可以實現先進隊列的先出,所以我們就可以讓二叉樹的每一層一次進入隊列,這樣,在對隊列的元素進行出隊操作,然後打印,這樣,所得到的就是一個層序遍歷的二叉樹了。

我做了一個簡單的圖來進行示意:

首先,我們有這樣的一個二叉樹的,並且我們已經有了一個空隊列,我們現在開始進行入隊操作。

1.首先進行根節點的入隊操作

在根節點入隊後,我們在根節點入隊後,我們再進行一個出隊,然後打印,並且在這之後在將根節點的左右孩子節點入隊,這樣,就使左右孩子在隊列中了。

 

我們繼續進行出隊操作,然後對出對的節點進行打印,並且把這個節點的左右孩子進行入隊操作(左右孩子不是空節點)。完了之後繼續進行出隊操作,然後將新出對的節點進行打印操作,然後左右孩子入隊操作。這樣就形成了一個循環,那麼如何結束循環呢,這裏就有一個特殊條件:如果隊列是空隊列,就表明了這一層的二叉樹是空的,所有的節點都進行了入隊,然後出隊操作,這個時候,就可以結束循環了。

我這裏準備了一些簡單的代碼,因爲這個代碼是我臨時準備的,不會很充分,但是足以說明執行過程。這裏需我額外補充一點,如果你調用的方法不需要執行一些進行變量值的改變的話,就不要進行地址的傳遞,僅僅只是個方法傳遞一個臨時拷貝,這樣,可以防止調用的方法進行值的修改,算是增加了方法的安全性。

typedef struct TreeNode {
    int val;
	struct TreeNode *left;
	struct TreeNode *right;
}TreeNode;
typedef struct MyQueue
{
	TreeNode* qu[100];
	int head;
	int rear;
}MyQueue;
bool isempty(MyQueue *qu)
{
	if (qu->head + 1 == qu->rear)
	{
		return true;
	}
	else
	{
		return false;
	}
}
TreeNode *pop(MyQueue * qu)
{

	qu->head++;
	return qu->qu[qu->head - 1];

}

void push(MyQueue *Q, TreeNode * root)
{
	Q->qu[Q->rear - 1] = root;
	Q->rear++;

}
void leveOrder(TreeNode * root) \\層序遍歷方法
{
	MyQueue Q;
	Q.rear = 1;
	Q.head = 0;
	push(&Q,root);
	
	while (!isempty(&Q))
	{
		root = pop(&Q);
		if (root == NULL)
		{
			printf(" NULL ");
		}
		else
		{
			printf(" %d ", root->val);
		}
		if (root)
		{
			push(&Q, root->left);
			push(&Q, root->right);
		}
	
	}

}
void BinTreeCreat(TreeNode ** bt) //二叉樹的創建過程,我是使用“#”字符進行NULL的創建的,大家看看就行了
{
	int i;
	scanf("%d", &i);
	if (i == 0)
	{
		*bt = NULL;
	}
	else
	{
		*bt = (TreeNode *)malloc(sizeof(TreeNode));
		assert(bt);
		(*bt)->val = i;
		BinTreeCreat(&((*bt)->left));
		BinTreeCreat(&((*bt)->right));
	}
}
int main()
{
	TreeNode * bt;
	BinTreeCreat(&bt);
	leveOrder(bt);

	return 0;
}

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章