加载中...

[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;
    }
}

posted @ 2022-12-22 18:00  Vincy9501  阅读(15)  评论(0编辑  收藏  举报