二叉树的层次遍历(leetcode102):
1.非递归遍历,借助队列实现,队列多用于广度遍历:
public class L102BinaryTreeLevelOrderTraversal {
public static List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new LinkedList<List<Integer>>();
if(root == null){
return res;
}
LinkedList<Tree> ll = new LinkedList<Tree>();
ll.add(new Tree(root, 1));
while(!ll.isEmpty()){
Tree tree = ll.pop();
TreeNode curr = tree.treeNode;
int level = tree.level;
if(res.size() < level){
List<Integer> list = new LinkedList<Integer>();
res.add(list);
}
res.get(level-1).add(curr.val);
if(curr.left !=null ){
ll.add(new Tree(curr.left, level+1));
}
if(curr.right !=null ){
ll.add(new Tree(curr.right, level+1));
}
}
return res;
}
}
class Tree{
TreeNode treeNode;
Integer level;
public Tree(TreeNode treeNode, Integer level) {
super();
this.treeNode = treeNode;
this.level = level;
}
}
2.递归遍历,思路和非递归一样
class Solution {
public static List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new LinkedList<List<Integer>>();
res = levelOrderHelper(root,res,0);
return res;
}
public static List<List<Integer>> levelOrderHelper(TreeNode node,List<List<Integer>> list,int level){
List<List<Integer>> res = list;
if(node == null){
return res;
}
if( level >= list.size()){
res.add(new LinkedList<Integer>());
}
res.get(level).add(node.val);
if(node.left != null){
levelOrderHelper(node.left,res,level+1);
}
if(node.right != null){
levelOrderHelper(node.right,res,level+1);
}
return res;
}
}
二叉树的倒的层次遍历(leetcode107)
思路:简单的方法就是,将上面的层次遍历的答案倒序放入另外一个List中,就变成倒叙层次遍历了。
同样道理,利用上面的递归遍历,先递归再存值,存放时相应值存放在list.size-level-1层中就可以了
public class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> res = new LinkedList<List<Integer>>();
levelOrderHelper(res, root, 0);
return res;
}
public void levelOrderHelper(List<List<Integer>> list, TreeNode root, int level) {
if(root == null) return;
if(level >= list.size()) {
list.add(0, new LinkedList<Integer>());
}
levelOrderHelper(list, root.left, level+1);
levelOrderHelper(list, root.right, level+1);
list.get(list.size()-level-1).add(root.val);
}
}