二叉树的层次遍历II
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)。
深度优先遍历DFS:
public class TreeNode{
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val){ this.val = val;}
}
/**
*二叉树的层次遍历:给定一个二叉树,返回其节点值自底向上的层次遍历。
* (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
* 递归:dfs
* @param root
* @return
*/
public List<List<Integer>> levelOrderBottom2(TreeNode root){
List<List<Integer>> ret = new ArrayList<List<Integer>>();
if(root != null){
dfs(ret,root,1);
}
return ret;
}
/**
*度优先遍历dfs: DFS 不是按照层次遍历的,
* 为了让递归的过程中同一层的节点放到同一个列表中,在递归时要记录每个节点的深度 level。
* 递归到新节点要把该节点放入 level 对应列表的第一个位置。
* @param ret
* @param tree
* @param level
* @return
*/
private void dfs(List<List<Integer>> ret, TreeNode tree, int level){
//当前节点对应的层数level不在对应的列表中,创建
if(ret.size() < level){
ret.add(0,new ArrayList<Integer>());
}
ret.get(ret.size()-level).add(tree.val);
if(tree.left != null){
dfs(ret,tree.left,level+1);
}
if(tree.right != null){
dfs(ret,tree.right,level+1);
}
}
进阶:广度优先遍历BFS:使用队列
/**
* 二叉树的层次遍历:给定一个二叉树,返回其节点值自底向上的层次遍历。
* (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
* 非递归:使用队列:广度优先遍历BFS
* @param root
* @return
*/
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> ret = new ArrayList<List<Integer>>();
if(root == null){
return ret;
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
//根节点入队列
queue.add(root);
while(queue.size() >0){
//队列元素的个数相当于该层的节点数
int levelNum = queue.size();
List<Integer> temp = new LinkedList<Integer>();
for(int i = 0 ;i < levelNum;i++){
//遍历该层所有节点
//出队列,将该元素从队列中弹出
TreeNode node = queue.poll();
temp.add(node.val);
//将该元素的左孩子和右孩子节点入队列
if(node.left != null){
queue.add(node.left);
}
if(node.right != null){
queue.add(node.right);
}
}
//将temp加入最终结果集ret中的第一个索引位置
ret.add(0,temp);
}
return ret;
}