二叉樹層遍歷

二叉樹的層遍歷又可以成爲廣度優先遍歷,廣度優先通常都可以利用隊列來解決:首先把根節點加入隊列,然後判斷隊列是否爲空,若非空就把隊頭元素作爲當前節點,然後依次判斷當前節點的左右子節點是否爲空,若非空則加入隊列;循環上述過程,直到隊列爲空。代碼如下:

#include "stdafx.h"
#include<iostream>
#include <queue>
#include <vector>
using namespace std;
typedef struct binary_tree_node
{
	struct binary_tree_node* left;
	struct binary_tree_node* right;
	int data;
}Binary_Tree_Node;

void visit(Binary_Tree_Node* pNode)
{
	if (pNode!=NULL)
	{
		cout<<pNode->data<<" ";
	}
}
Binary_Tree_Node* create_tree(vector<int> dataVec);
void insert_node(Binary_Tree_Node* root,int data);
void level_order(Binary_Tree_Node* root);
void free_node(Binary_Tree_Node* root);
int _tmain(int argc, _TCHAR* argv[])
{
	int tmpArray[]={1,2,3,4,5,6,7,};
	vector<int> input(tmpArray,tmpArray+7);
	Binary_Tree_Node *root=create_tree(input);
	level_order(root);
	free_node(root);
	return 0;
}
Binary_Tree_Node* create_tree(vector<int> dataVec)
{
	if (dataVec.size()==0)
	{
		return nullptr;
	}
	Binary_Tree_Node *root=new Binary_Tree_Node();
	root->left=NULL;
	root->right=NULL;
	root->data=dataVec[0];
	for (int i=1;i<dataVec.size();++i)
	{
		insert_node(root,dataVec[i]);
	}
	return root;
}
void insert_node(Binary_Tree_Node* root,int data)
{
	if (root->left==NULL)
	{
		Binary_Tree_Node* leftChild=new Binary_Tree_Node();
		leftChild->left=NULL;
		leftChild->right=NULL;
		leftChild->data=data;
		root->left=leftChild;
		return;
	}
	if (root->right==NULL)
	{
		Binary_Tree_Node* leftChild=new Binary_Tree_Node();
		leftChild->left=NULL;
		leftChild->right=NULL;
		leftChild->data=data;
		root->right=leftChild;
		return;
	}
	insert_node(root->left,data);
}
void level_order(Binary_Tree_Node* root)
{
	if (root==NULL)
	{
		return;
	}
	queue<Binary_Tree_Node*> pQueue;
	pQueue.push(root);
	while(!pQueue.empty())
	{
		Binary_Tree_Node *curNode=pQueue.front();
		pQueue.pop();
		visit(curNode);
		if (curNode->left!=NULL)
		{
			pQueue.push(curNode->left);
		}
		if (curNode->right!=NULL)
		{
			pQueue.push(curNode->right);
		}
	}
}
void free_node(Binary_Tree_Node* root)
{
	if (root->left!=NULL)
	{
		free_node(root->left);
	}
	if (root->right!=NULL)
	{
		free_node(root->right);
	}
	delete root;
	root=NULL;
}
上述程序生成的二叉樹如下圖:

層遍歷程序結果如下:



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