对于二叉树的最好的解决办法就是递归。遍历方法无外乎先序遍历,中序遍历,后序遍历方法以及层序遍历方法。
这里给大家安利一个关于树的面试题的链接,博主walkinginthewind比较全面且详细的介绍了二叉树相关的面试题:
http://blog.csdn.net/walkinginthewind/article/details/7393134
对于层序遍历,最好的方法就是用队列记录遍历节点的值,按层打印。
求解过程是:
(1)先将根节点入队,然后判断队列是否为空。
(2)如果不为空,则取出队列首节点并输出,判断该节点是否有子节点,如果有就加入到队列中。
通常情况下是打印队列首节点,形成一个层序遍历序列,但由于题目要求,要按照层来输出,
所以对于每一层都要判断队列的长度。其队列的长度就代表着每一层有多少个节点。
代码:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<int> row;//记录每一行的节点
vector<vector<int>> res;//记录层序输出的结果
if(!pRoot) return res;
queue<TreeNode*> que;//构建队列,先插入根节点
que.push(pRoot);
while(!que.empty()){
int len = que.size();//获取每一层的节点数,也就是当前队列的长度
for(int i = 0; i < len; ++i){
TreeNode* pNode = que.front();//获取队列首节点,并打印(插入到row中)
row.push_back(pNode->val);
if(pNode->left)//判断是否存在左子节点,若存在则插入到队列
que.push(pNode->left);
if(pNode->right)//判断是否存在右子节点,若存在则插入到队列
que.push(pNode->right);
que.pop();//弹出队列首节点
}
res.push_back(row);
row.clear();//清空行记录
}
return res;
}
参考:《剑指offer》、牛客网
ps:只是学习记录过程,如有侵权请指出,定会修正!若有错误,也欢迎指出!