剑指 Offer 第 6 天 搜索与回溯算法 (简单)
面试题32 - I. 从上到下打印二叉树
题目描述
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:
给定二叉树: [3,9,20,null,null,15,7],
返回:
[3,9,20,15,7]
思路
这个是层次遍历,一层一层的遍历,因此不能用dfs,只能用bfs,利用队列,在python中是deque
代码
class Solution:
def levelOrder(self, root: TreeNode) -> List[int]:
if not root :
return []
q = collections.deque()
q.append(root)
a = []
while q :
t = q.popleft()
if t.left :
q.append(t.left)
if t.right :
q.append(t.right)
a.append(t.val)
return a
剑指 Offer 32 - II. 从上到下打印二叉树 II
题目描述
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
样例
输入描述同上一个题目
输出描述如下:
[
[3],
[9,20],
[15,7]
]
思路
基本思想和上一个题目差不多,无非是结果存储的方式不一样
代码
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root :
return []
q = collections.deque()
res = []
q.append(root)
while q:
tmp = []
for _ in range(len(q)):
t = q.popleft()
tmp.append(t.val)
if t.left :
q.append(t.left)
if t.right :
q.append(t.right)
res.append(tmp)
return res
剑指 Offer 32 - III. 从上到下打印二叉树 III
题目描述
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
样例
输入描述同上一题目
输出描述如下
[
[3],
[20,9],
[15,7]
]
思路
写法和上一个题目差不多,二维数组存储时根据行数下标判断从左到右还是从右到左
代码
c++代码
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> que;
que.push(root);
vector<vector<int>> g;
vector<int> tmp;
if(!root)return g;
while(!que.empty()){
int len = que.size();
tmp.clear();
while(len--){
TreeNode* t = que.front();
que.pop();
tmp.push_back(t->val);
if(t->left){
que.push(t->left);
}
if(t->right){
que.push(t->right);
}
}
g.push_back(tmp);
}
for(int i=1;i<g.size();i+=2){
reverse(g[i].begin(),g[i].end());
}
return g;
}
};
python代码
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root :
return []
q = collections.deque()
res = []
q.append(root)
i = 0
while q:
i = i + 1
tmp = collections.deque()
for _ in range(len(q)):
t = q.popleft()
if i%2==1 :
tmp.append(t.val)
else :
tmp.appendleft(t.val)
if t.left :
q.append(t.left)
if t.right :
q.append(t.right)
res.append(list(tmp))
return res
这篇文章如果对小伙伴们有帮助的话,希望点个赞支持一下~ 十分感谢~