本人电子系,只为一学生。心喜计算机,小编以怡情。
给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问)
您在真实的面试中是否遇到过这个题? Yes
样例
给一棵二叉树 {3,9,20,#,#,15,7} :
返回他的分层遍历结果:
[
[3],
[9,20],
[15,7]
]
思路:用两个队列来实现,不过我这里用的ArrayList来模拟队列
public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
// write your code here
if(root==null) return new ArrayList<>();
ArrayList<TreeNode> temp=new ArrayList<>();
ArrayList<TreeNode> t=new ArrayList<>();
//建立一个返回的可变数组
List<ArrayList<Integer>> ret=new ArrayList<>();
temp.add(root);
//将头结点放入,因为我之后的算法不能解决头结点的问题
//举例ret=[[3]]
ArrayList<Integer> a=new ArrayList<>();
a.add(root.val);
ret.add(a);
//当两者都空时,说明遍历结束
while(!temp.isEmpty()||!t.isEmpty())
{
//举例,第一个队列放的3,队列二为空
if(t.isEmpty())
{
while(!temp.isEmpty())
{
TreeNode p=temp.remove(0);
//将3的左右结点放到队列二中
if(p.left!=null)
{
t.add(p.left);
}
if(p.right!=null)
{
t.add(p.right);
}
}
//将队列二的内容放到ret中,[[3],[9,20]]
ArrayList<Integer> linshi=new ArrayList<>();
for(TreeNode k:t)
linshi.add(k.val);
if(!linshi.isEmpty())
ret.add(linshi);
}
if(temp.isEmpty())
{
while(!t.isEmpty())
{
TreeNode p=t.remove(0);
//同理,将队列二的全部左右结点放到队列一中
//队列一:15,7
if(p.left!=null)
{
temp.add(p.left);
}
if(p.right!=null)
{
temp.add(p.right);
}
}
//然后将队列一的内容全放到ret中
//此时ret=[[3],[9,20],[15,7]]
ArrayList<Integer> linshi=new ArrayList<>();
for(TreeNode k:temp)
linshi.add(k.val);
if(!linshi.isEmpty())
ret.add(linshi);
}
}
return (ArrayList<ArrayList<Integer>>) ret;
}