1. 程式人生 > 實用技巧 >劍指offer_22:從上往下列印二叉樹

劍指offer_22:從上往下列印二叉樹

從上到下打印出二叉樹的每個節點,同一層的節點按照從左到右的順序列印。

例如:
給定二叉樹: [3,9,20,null,null,15,7],

返回:
[3,9,20,15,7]

提示:
節點總數 <= 1000

BFS

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int[] levelOrder(TreeNode root) {
        if(root==null) return new int[0];
        Queue<TreeNode> queue=new LinkedList<>();
        List<Integer> list=new ArrayList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            TreeNode node=queue.poll();
            list.add(node.val);
            if(node.left!=null) queue.offer(node.left);
            if(node.right!=null) queue.offer(node.right);
        }
        int[] res=new int[list.size()];
        for(int i=0;i<list.size();i++){
            res[i]=list.get(i);
        }
        return res;
    }
}

提高1:

從上到下按層列印二叉樹,同一層的節點按從左到右的順序列印,每一層列印到一行。

例如:
給定二叉樹: [3,9,20,null,null,15,7],

返回其層次遍歷結果:
[
[3],
[9,20],
[15,7]
]

提示:
節點總數 <= 1000

1、BFS

/**
 * 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>> res=new ArrayList<>();
        if(root==null) return res;
        Queue<TreeNode> queue=new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            List<Integer> list=new ArrayList<>();
            int size=queue.size();
            for(int i=0;i<size;i++){
                TreeNode node=queue.poll();
                list.add(node.val);
                if(node.left!=null) queue.offer(node.left);
                if(node.right!=null) queue.offer(node.right);
            }
            res.add(list);
        }
        return res;
    }
}

2、DFS

/**
 * 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>> res=new ArrayList<>();
        levelOrder(root,res,0);
        return res;
    }
    public void levelOrder(TreeNode root,List<List<Integer>> res,int level){
        if(root==null) return;
        if(level>=res.size()){
            res.add(new ArrayList<Integer>());
        }
        res.get(level).add(root.val);
        if(root.left!=null) levelOrder(root.left,res,level+1);
        if(root.right!=null) levelOrder(root.right,res,level+1);
    }
}

提高2:

請實現一個函式按照之字形順序列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右到左的順序列印,第三行再按照從左到右的順序列印,其他行以此類推。

例如:
給定二叉樹: [3,9,20,null,null,15,7],

返回其層次遍歷結果:
[
[3],
[20,9],
[15,7]
]

提示:
節點總數 <= 1000

/**
 * 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>> res=new ArrayList<>();
        if(root==null) return res;
        Queue<TreeNode> queue=new LinkedList<>();
        queue.offer(root);
        int level=1;
        while(!queue.isEmpty()){
            LinkedList<Integer> list=new LinkedList<>();
            int size=queue.size();
            for(int i=0;i<size;i++){
                TreeNode node=queue.poll();
                if(level%2!=0){
                    list.addLast(node.val);
                }else{
                    list.addFirst(node.val);
                }
                if(node.left!=null) queue.offer(node.left);
                if(node.right!=null) queue.offer(node.right);
            }
            level++;
            res.add(list);
        }
        return res;
    }
}