搜索-遍历

  • 每个节点要访问一次
  • 每个节点仅访问一次
  • 对于节点的访问顺序不同

    1. -深度优先 `dfs` <br /> -广度优先 `bfs` <br /> -优先级优先

    dfs代码模板(递归)

    ```java public List> levelOrder(TreeNode root) {

    1. List<List<Integer>> allResults = new ArrayList<>();
    2. if(root == null){
    3. return allResults;
    4. }
    5. travel(root, 0, allResults);
    6. return allResults;

    }

  1. private void travel(TreeNode root, int level, List<List<Integer>> results){
  2. //递归退出条件
  3. if(results.size() == level){
  4. results.add(new ArrayList<>());
  5. }
  6. results.get(level).add(root.val);
  7. if(root.left != null){
  8. travel(root.left, level+1, results);
  9. }
  10. if(root.right != null){
  11. travel(root.right, level+1, results);
  12. }
  13. }
  1. <a name="Xy0gF"></a>
  2. ### bfs代码模板(队列)
  3. ```java
  4. public class TreeNode {
  5. int val;
  6. TreeNode left;
  7. TreeNode right;
  8. TreeNode(int x) {
  9. val = x;
  10. }
  11. }
  12. public List<List<Integer>> levelOrder(TreeNode root) {
  13. List<List<Integer>> allResults = new ArrayList<>();
  14. if (root == null) {
  15. return allResults;
  16. }
  17. Queue<TreeNode> nodes = new LinkedList<>();
  18. nodes.add(root);
  19. while (!nodes.isEmpty()) {
  20. int size = nodes.size();
  21. List<Integer> results = new ArrayList<>();
  22. for (int i = 0; i < size; i++) {
  23. TreeNode node = nodes.poll();
  24. results.add(node.val);
  25. if (node.left != null) {
  26. nodes.add(node.left);
  27. }
  28. if (node.right != null) {
  29. nodes.add(node.right);
  30. }
  31. }
  32. allResults.add(results);
  33. }
  34. return allResults;
  35. }

LeetCode题目

  1. 二叉树的层序遍历
  2. 括号生成
  3. 在每个树行中找最大值
  4. 岛屿数量