LeetCode 102. 二叉树的层次遍历 java实现 个人算法之旅

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3

   / \

  9  20

    /  \

   15   7

返回其层次遍历结果:

[

  [3],

  [9,20],

  [15,7]

解题思路:

层次遍历,优先想到广度优先搜索(BFS)和深度优先搜索(DFS)。解题要点为需要判断一层的末节点在那。

1)广度优先搜索

通过使用一个队列来解决问题。队列的先进先出,将每一层的全部入队列,然后再出队列并将其移除,寻找其左右节点,再入队列。

一开始将root入队列,队列的大小即为当前层的大小。

只要队列不为空就一直遍历,将队列中的第一个节点获取并移除(p.poll())。

只要当前的节点的左节点,右节点不为空,就添加进队列。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        //定义结果集
        List<List<Integer>> result = new ArrayList<>();
        if(root == null)
            return result;//不是都返回null的,这里返回result
        Queue<TreeNode> queue = new LinkedList<TreeNode>();//队列
        queue.add(root);//把根节点添加入队列
        while(!queue.isEmpty()){//队列不为空即一直循环
            List<Integer> list = new ArrayList<>();//定义一个每一层的list
            int levelSize = queue.size();//队列中目前所存在的数即为当前层所有的数
            
            for(int i = 0; i < levelSize; i++){
                TreeNode currentNode = queue.poll();//获得并移除第一个节点在遍历的里面,这样才能将当前层的数全部从队列中移除
                list.add(currentNode.val);//当前层的节点加入
                if(currentNode.left != null)
                    queue.add(currentNode.left);//先把左节点加入队列
                if(currentNode.right != null)
                    queue.add(currentNode.right);//再加入右节点
            }
            result.add(list);
        }
        return result;
    }
}

2)深度遍历

解题思路:在于判断所在的那一层(级)。 通过获取result的大小对level进行判断。如果result的大小和level相等,说明该result中第一次出现这个level,新建一个list添加进去。

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        //定义结果集
        List<List<Integer>> result = new ArrayList<>();
       //递归等级
        int level = 0;
        
        return dfs(root,level,new ArrayList<>());
    }
    private List<List<Integer>> dfs(TreeNode root,int level,List<List<Integer>> result){
        //递归终止条件
        if(root == null)
            return new ArrayList<>();
        //定义一个每一层的list
        List<Integer> currentList;
        //如果当前层没有结果,即当前的result的大小 等于level,因为每添加一个list,result的大小就会加1。
        
        if(result.size() == level){
            currentList = new ArrayList<>();
            currentList.add(root.val);
            result.add(currentList);
        }else{
            currentList = result.get(level);//获得已存在的level
            currentList.add(root.val);
            result.set(level,currentList);//将新输入的list放回原来所在的result的位置
        }
        dfs(root.left,level + 1,result);
        dfs(root.right,level + 1,result);
        return result;
    }
}

 

猜你喜欢

转载自blog.csdn.net/qq_38765867/article/details/88370997