[LeetCode]Binary Tree Level Order Traversal

来源:互联网 发布:答题软件哪个好 编辑:程序博客网 时间:2024/06/10 04:34

Question
Given a binary tree, return the level order traversal of its nodes’ values. (ie, from left to right, level by level).

For example:
Given binary tree [3,9,20,null,null,15,7],

    3   / \  9  20    /  \   15   7

return its level order traversal as:

[  [3],  [9,20],  [15,7]]

本题难度Easy。有2种算法分别是: 递归法和迭代法

1、递归法

【复杂度】
时间 O(b^(h+1)-1) 空间 O(b^h)

【思路】
本题实质是广度优先搜索BFS,而用队列可以轻松地实现它。不断地从队列q中取出节点n,将其值n.val写入list,再将n的左右两个节点放入新的队列nextQ中。完毕后,将list放入结果ans中,然后进行下一个层序遍历,直至到达 base case 条件。

【注意】
第15行和第31、32行都对节点是否为null进行了判断。

【代码】

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {    public List<List<Integer>> levelOrder(TreeNode root) {        //require        List<List<Integer>> ans=new LinkedList<>();        Queue<TreeNode> q=new LinkedList<>();        if(root!=null)q.add(root);        //invariant        helper(q,ans);        //ensure        return ans;    }    private void helper(Queue<TreeNode> q,List<List<Integer>> ans){        //base case        if(q.isEmpty())            return;        List<Integer> list=new LinkedList<>();        Queue<TreeNode> nextQ=new LinkedList<>();        while(!q.isEmpty()){            TreeNode n=q.remove();            list.add(n.val);            if(n.left!=null)nextQ.add(n.left);            if(n.right!=null)nextQ.add(n.right);        }        ans.add(list);        helper(nextQ,ans);    }}

2、迭代法

【复杂度】
时间 O(b^(h+1)-1) 空间 O(b^h)

【思路】
在递归法基础上改过来,不同点在于始终只使用一个队列q,为了在队列中区分各层节点,利用q的大小对20-25行的循环次数加以控制。

【代码】

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {    public List<List<Integer>> levelOrder(TreeNode root) {        //require        List<List<Integer>> ans=new LinkedList<>();        Queue<TreeNode> q=new LinkedList<>();        if(root!=null)q.add(root);        //invariant        while(!q.isEmpty()){            List<Integer> list=new LinkedList<>();            int size=q.size();            for(int i=0;i<size;i++){                TreeNode n=q.remove();                list.add(n.val);                if(n.left!=null)q.add(n.left);                if(n.right!=null)q.add(n.right);            }            ans.add(list);        }        //ensure        return ans;    }}

参考

[Leetcode] Binary Tree Traversal 二叉树遍历

0 0