按层打印树的每个结点
来源:互联网 发布:飞思卡尔编程软件 编辑:程序博客网 时间: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<<" ";
}
}
题目(微软):
输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
例如输入
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<<" ";
}
}
- 按层打印树的每个结点
- 16.输入一颗二元树,从上往下按层打印树的每个结点
- 【练习】输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印
- 【算法】输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印
- 输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
- Np16、输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
- 输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印
- 输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印(16)
- 题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
- 算法习题16:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印
- 14. 微软面试题:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
- 16题:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
- 16 输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
- 输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印
- 输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印
- 微软算法100道题-----输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印
- 输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印
- 【java 面试100】16输入一颗二元树,从上往下按层打印树的每个结点
- 运用消息队列进行进程间通信
- hdoj1232畅通工程
- Oracle(二)---------条件查询与排序数据
- ext js 笔记
- Linux动态链接库.so文件的创建与使用
- 按层打印树的每个结点
- Red Hat 5下LLVM配置使用
- Android中常见的MVC模式
- 保护视力,调整电脑文件夹,网页,软件等背景
- Linux socket 完整的读写函数
- VS2005打开VS2008工程文件的方法
- Fibonacci数
- 心事心语
- JobTracker节点后台线程之CompleteJobStatusStore