按层打印树的每个结点

来源:互联网 发布:飞思卡尔编程软件 编辑:程序博客网 时间:2024/04/27 14:20
第16题(树):
题目(微软):
输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。  
例如输入
   8
  / /
 6 10
/ / / /
5 7 9 11
输出8 6 10 5 7 9 11。




//coder:LEE
//20120227
#include<iostream>
#include<CASSERT>
#include<QUEUE>
using namespace std;
struct BSTreeNode  
{
int m_nValue;
BSTreeNode* m_pLeft;
BSTreeNode * m_pRight;
};
void AddNode(BSTreeNode *& root,int n)
{
if (!root)
{
root=(BSTreeNode *)malloc(sizeof(BSTreeNode ));
root->m_nValue=n;
root->m_pLeft=NULL;
root->m_pRight=NULL;
return;
}
if(n<root->m_nValue)
AddNode(root->m_pLeft,n);
else
AddNode(root->m_pRight,n);
}
void TraverseByFloor(BSTreeNode *root)
{
assert(root!=NULL);
queue <BSTreeNode *> q;
q.push(root);
while(!q.empty())
{
BSTreeNode *pCur=q.front();
q.pop();
if(pCur->m_pLeft!=NULL)
q.push(pCur->m_pLeft);
if(pCur->m_pRight!=NULL)
q.push(pCur->m_pRight);
cout<<pCur->m_nValue<<"  ";
}
}


int main()
{
BSTreeNode * root=NULL;
AddNode(root,8);
AddNode(root,6);
AddNode(root,10);
AddNode(root,5);
AddNode(root,7);
AddNode(root,9);
AddNode(root,11);
TraverseByFloor(root);
cout<<endl;
return 0;
}


 扩展一:上文给出的代码,所有结点都输出在同一行。如果希望仅仅同层结点输出在同一行,该如何修改代码呢?
思路:在root后将NULL入队列,每pop到NULL则添加到队尾,如果遇到NULL,表明下一层的所有结点已遍历加入了队列。
void TraverseByFloor(BSTreeNode *root)
{
assert(root!=NULL);
deque <BSTreeNode *> d;
d.push_back(root);
d.push_back(NULL);
while(d.size())
{
BSTreeNode *pCur=d.front();
d.pop_front();
if(pCur==NULL)
{
if(d.size())
d.push_back(NULL);
cout<<endl;
continue;
}
if(pCur->m_pLeft!=NULL)
d.push_back(pCur->m_pLeft);
if(pCur->m_pRight!=NULL)
d.push_back(pCur->m_pRight);
cout<<pCur->m_nValue<<"  ";
}

}


扩展二:之前讨论的都是从上往下、从左往右遍历二叉树,那么如果希望自下往上、从左右往右遍历二叉树,该如何修改代码呢?
思路:遍历每个节点,按先右节点后左节点顺序将节点加入队列,最后从后向前遍历输出即是从上往下、从左往右遍历的二叉树。
void TraverseByFloor(BSTreeNode *root)
{
assert(root!=NULL);
deque <BSTreeNode *> d;
d.push_back(root);
d.push_back(NULL);
for(int i=0;i<d.size();i++)
{
BSTreeNode *pCur=d[i];
if(pCur==NULL)
{
if(i==d.size()-1)
d.pop_back();
else
d.push_back(NULL);
continue;
}
if(pCur->m_pRight!=NULL)
d.push_back(pCur->m_pRight);
if(pCur->m_pLeft!=NULL)
d.push_back(pCur->m_pLeft);
}
while (d.size())
{
BSTreeNode *pCur=d.back();
d.pop_back();
if(!pCur)
cout<<endl;
else
cout<<pCur->m_nValue<<"  ";
}
}
原创粉丝点击