[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
- LeetCode[Tree]: Binary Tree Level Order Traversal
- *(leetcode) Binary Tree Level Order Traversal (tree)
- [leetcode][tree] Binary Tree Level Order Traversal
- LeetCode: Binary Tree Level Order Traversal
- LeetCode: Binary Tree Zigzag Level Order Traversal
- LeetCode: Binary Tree Level Order Traversal II
- [LeetCode]Binary Tree Level Order Traversal
- [LeetCode]Binary Tree Level Order Traversal II
- [LeetCode]Binary Tree Zigzag Level Order Traversal
- LeetCode Binary Tree Level Order Traversal
- LeetCode Binary Tree Level Order Traversal II
- LeetCode Binary Tree Zigzag Level Order Traversal
- [Leetcode] Binary Tree Level Order Traversal
- [Leetcode] Binary Tree Level Order Traversal II
- [Leetcode] Binary Tree Zigzag Level Order Traversal
- Leetcode: Binary Tree Zigzag Level Order Traversal
- LeetCode Binary Tree Level Order Traversal
- LeetCode Binary Tree Level Order Traversal II
- 数据库索引
- RHEL7系统修复
- Linux基本命令
- OpenCV—基本数据结构与示例
- thinkphp模板跳转问题
- [LeetCode]Binary Tree Level Order Traversal
- 【没有assembly目录】spark2.0.0启动时无法访问spark-assembly-*.jar的解决办法
- mybatis association 复杂类型联合操作
- 七牛云及 HTTP标准状态码总结
- boost 1.56.0 编译及使用,并记要点
- 1014. Waiting in Line (30)
- redis centos 安装 install
- MySQL 修改字段为不可重复
- 二维码的边缘检测