[leetcode]第 6 天 搜索与回溯算法(简单)
32 - I. 从上到下打印二叉树
思路
没有思路。。看题解
要求二叉树从上至下打印,叫做二叉树的广度优先搜索(BFS)。
BFS通常借助队列的先入先出特性实现。
算法流程:
1. 特例处理:当树的根节点为空,则直接返回空列表 [];
**2. 初始化: **打印结果列表 res = [] ,包含根节点的队列 queue = [root];
**3. BFS 循环: **当队列 queue 为空时跳出;
出队: 队首元素出队,记为 node;
打印: 将 node.val 添加至列表 tmp 尾部;
添加子节点: 若 node 的左(右)子节点不为空,则将左(右)子节点加入队列 queue ;
4. 返回值:返回打印结果列表res
class Solution {
public int[] levelOrder(TreeNode root) {
if(root == null) return new int[0];
Queue<TreeNode> queue = new LinkedList<>(){{ add(root); }};
ArrayList<Integer> ans = new ArrayList<>();
while(!queue.isEmpty()) {
TreeNode node = queue.poll();
ans.add(node.val);
if(node.left != null) queue.add(node.left);
if(node.right != null) queue.add(node.right);
}
int[] res = new int[ans.size()];
for(int i = 0; i < ans.size(); i++)
res[i] = ans.get(i);
return res;
}
}
32 - II. 从上到下打印二叉树 II
打印成这样:
[
[3],
[9,20],
[15,7]
]
思路
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
Queue<TreeNode> myQ = new LinkedList<>();
if(root != null) myQ.add(root);
List<List<Integer>> myList = new ArrayList<>();
while(!myQ.isEmpty()){
List<Integer> tmp = new ArrayList<>();
for(int i = myQ.size(); i > 0; i--){
TreeNode node = myQ.poll();
tmp.add(node.val);
if(node.left != null) myQ.add(node.left);
if(node.right != null) myQ.add(node.right);
}
myList.add(tmp);
}
return myList;
}
}
32 - III. 从上到下打印二叉树 III
思路
要求是奇数行从左到右打印,偶数行从右至左打印。
有一个很巧妙的方法,就是判断List的size(),如果%2==1的话,就说明下一行是偶数行,就需要从右至左打印。
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
Queue<TreeNode> myQ = new LinkedList<>();
List<List<Integer>> myList = new ArrayList<>();
if(root != null) myQ.add(root);
while(!myQ.isEmpty()){
List<Integer> tmp = new ArrayList<>();
for(int i = myQ.size(); i > 0 ; i--){
TreeNode node = myQ.poll();
tmp.add(node.val);
if(node.left != null) myQ.add(node.left);
if(node.right != null) myQ.add(node.right);
}
if(myList.size() % 2 == 1) Collections.reverse(tmp);
myList.add(tmp);
}
return myList;
}
}