二叉树的层次遍历
题目
给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问)
样例
给一棵二叉树 {3,9,20,#,#,15,7} :
返回他的分层遍历结果:
挑战
挑战1:只使用一个队列去实现它
挑战2:用DFS算法来做题解
1.单队列实现
在对节点队列进行遍历时,要提前保存队列的长度n,而不要在循环中去动态获取。
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param root: The root of binary tree.
* @return: Level order a list of lists of integer
*/
public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
if (root == null)
{
return list;
}
Queue<TreeNode> q = new LinkedList<TreeNode>();
q.add(root);
while (!q.isEmpty())
{
ArrayList<Integer> arr = new ArrayList<Integer>();
int n = q.size();
for (int i=0;i<n;i++)
{
TreeNode t = q.poll();
arr.add(t.val);
if (t.left != null)
{
q.add(t.left);
}
if (t.right != null)
{
q.add(t.right);
}
}
list.add(arr);
}
return list;
}
}
2.DFS法
/**
* Definition of TreeNode: public class TreeNode { public int val; public
* TreeNode left, right; public TreeNode(int val) { this.val = val; this.left =
* this.right = null; } }
*/
public class Solution
{
/**
* @param root
* : The root of binary tree.
* @return: Level order a list of lists of integer
*/
public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root)
{
ArrayList<ArrayList<Integer>> results = new ArrayList<ArrayList<Integer>>();
if (root == null)
{
return results;
}
int maxLevel = 0;
while (true)
{
ArrayList<Integer> level = new ArrayList<Integer>();
dfs(root, level, 0, maxLevel);
if (level.size() == 0)
{
break;
}
results.add(level);
maxLevel++;
}
return results;
}
private void dfs(TreeNode root, ArrayList<Integer> level, int curtLevel,
int maxLevel)
{
if (root == null || curtLevel > maxLevel)
{
return;
}
if (curtLevel == maxLevel)
{
level.add(root.val);
return;
}
dfs(root.left, level, curtLevel + 1, maxLevel);
dfs(root.right, level, curtLevel + 1, maxLevel);
}
}
Last Update 2016.9.22