题目:层序遍历二叉树
给定一棵二叉树,要求层序遍历该二叉树,即从上到下按层次访问该树,每一层单独输出一行,每一层要求访问的顺序为从左到右。我们在遍历的过程中将该层节点的孩子节点压入一个队列,这样就可以实现从上到下一层一层地遍历该二叉树。
初始时,根结点入队列。
然后,while循环判断队列不空时,弹出一个结点,访问它,并把它的所有孩子结点入队列。
template<class T>
struct BinaryTreeNode
{
BinaryTreeNode(const T& data)
:_data(data)
,_pLeft(NULL)
,_pRight(NULL)
{}
T _data;
BinaryTreeNode<T>* _pLeft;
BinaryTreeNode<T>* _pRight;
};
template<class T> class BinaryTree
{
typedef BinaryTreeNode<T> Node;
public:
BinaryTree()
:_pRoot(NULL)
{}
BinaryTree(const T array[],size_t size,const T& invalid)
{
size_t index = 0;
_CreateTree(_pRoot,array,size,index,invalid);
}
void LevelOrder()
{
cout<<"层序遍历二叉树:"<<endl;
queue<Node*> q;
Node* pCur = NULL;
if(NULL != _pRoot)
{
q.push(_pRoot);
while(!q.empty())
{
pCur = q.front();
cout<<pCur->_data <<" ";
if(pCur->_pLeft )
q.push(pCur->_pLeft );
if(pCur->_pRight )
q.push(pCur->_pRight );
q.pop();
}
}
cout<<endl;
}
private:
void _CreateTree(Node*& pRoot,const T array[],size_t size,size_t& index, const T& invalid)
{
if(index < size && array[index ]!= invalid)
{
pRoot = new Node(array[index]);
_CreateTree(pRoot->_pLeft ,array,size,++index,invalid);
_CreateTree(pRoot->_pRight ,array,size,++index,invalid);
}
}
private:
Node* _pRoot;
};
int main()
{
char *str = "124###35##6";
BinaryTree<char> t(str,strlen(str),'#');
t.LevelOrder ();
return 0;
}