Binary Tree Level Order Traversal
leetcode dfs bfs
Binary Tree Level Order Traversal
题目大意:
Given a binary tree, return the bottom-up level order traversal of its nodes’ values. (ie, from left to right, level by level from leaf to root).
For example:
Given binary tree {3,9,20,#,#,15,7},3
/ \
9 20
/ \
15 7
return its bottom-up level order traversal as:[
[15,7],
[9,20],
[3]
]
解题思路:
可以用dfs或者bfs来求解, 关键在于利用标记信息来区分树中的每一层, 详见代码
Code
/*** Definition for binary tree* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/class Solution {public:vector<vector<int> > levelOrder(TreeNode *root) {vector<vector<int> > res;// Solution 1: dfs// const int level = 1;// dfs(root, level, res);// Solution 2: bfsbfs(root, res);return res;}// 每个节点所在的level刚好与其在res对应的vector的下标对应起来// 通过给每个node做标记, 该标记就是其在树中的level, dfs能很好完成标记任务// 在标记level的时候, 实例化对应的vector, 并将其加入到res中// 这样通过level来找到node对应的vector, 并将其值val加入到vector中// 递归以上操作void dfs(TreeNode* root, const int level, vector<vector<int> >& res) {if(root == NULL) return;if(level > res.size()) {// 实例化res.push_back(vector<int>());}res[level - 1].push_back(root->val);// 递归操作dfs(root->left, level + 1, res);dfs(root->right, level + 1, res);}// 其实这道题适合用bfs来弄, 因为比较直观// 不管dfs还是bfs, 关键在于找到标记信息, dfs中的标记信息为level,// bfs中的标记信息为NULL// 每次遇到NULL, 则更新res// 值得注意的时, 每次遇到标志信息时, 需要检查当前队列是否为空,// 否则会导致死循环void bfs(TreeNode* root, vector<vector<int> >& res) {if(root == NULL) return;// 这里可以用queue替代list, 需要注意的是, list和queue的函数名有点出入// queue<TreeNode*) que;list<TreeNode*> que;TreeNode* anno = NULL;vector<int> subRes;que.push_back(root);que.push_back(anno);while(!que.empty()) {const TreeNode* top = que.front();que.pop_front();// 如果top不等于标记节点anno, 则添加当前节点到subRes中if(top != anno) {subRes.push_back(top->val);// 如果top的左右孩子节点不为空, 则添加到队列中// 为了防止空孩子节点充当标记节点annoif(top->left != anno) que.push_back(top->left);if(top->right != anno) que.push_back(top->right);// top等于当前标记节点anno, 则将某个level的所有节点加入到res中// 也就是将subRes加入到res中} else {res.push_back(subRes);// 需要注意!!!// 需要判断当前是否为队列尾, 不为队列尾, 则添加标记节点anno// 否则会导致死循环if(!que.empty()) {// 将标记节点anno加入队列que.push_back(anno);// 清空subRessubRes.clear();}}}}};
本文介绍了二叉树层次遍历的两种主要方法:深度优先搜索(DFS)和广度优先搜索(BFS),详细解释了如何使用这两种算法解决二叉树层次遍历问题,并提供了相应的代码实现。

938

被折叠的 条评论
为什么被折叠?



