[LeetCode]2020/11/17
LeetCode 102
题目描述
这是一道中等题,就是按层序遍历输出二叉树的节点值
解题思路
递归
采用递归的话,便是使用DFS,需要记录层级数
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:
return []
res = []
def dfs(index, r):
if len(res) < index:
res.append([])
res[index-1].append(r.val)
if r.left:
dfs(index+1, r.left)
if r.right:
dfs(index+1, r.right)
dfs(1,root)
return res
非递归
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if root is None:
return []
res = []
queue = [root]
while queue:
size = len(queue)
tmp = []
for _ in range(size):
r = queue.pop(0)
tmp.append(r.val)
if r.left:
queue.append(r.left)
if r.right:
queue.append(r.right)
res.append(tmp)
return res
细节整理
在使用Java实现的过程中,学习到了一些细节
-
ArrayList和LinkedList的区别
ArrayList是动态数组实现的,LinkedList是链表实现的。二者都是非线程安全的集合。
-
pop,poll,push等区别参考链接
LeetCode 107
题目描述
这是一道简单题,就是将上道题的顺序翻过来。核心思想就是将之前才采用的尾插法换为头插法。
解题记录
Python
对于Python直接使用了逆序[::-1]
class Solution:
def levelOrderBottom(self, root: TreeNode) -> List[List[int]]:
if root is None:
return []
res = []
queue = [root]
while queue:
size = len(queue)
res.append([])
for _ in range(size):
r = queue.pop(0)
res[-1].append(r.val)
if r.left:
queue.append(r.left)
if r.right:
queue.append(r.right)
return res[::-1]
Java
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> levelOrder = new LinkedList<List<Integer>>();
if (root == null) {
return levelOrder;
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while (!queue.isEmpty()){
List<Integer> level = new ArrayList<Integer>();
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
level.add(node.val);
TreeNode left = node.left, right = node.right;
if (left != null) {
queue.offer(left);
}
if (right != null) {
queue.offer(right);
}
}