LintCode 69-二叉树的层次遍历

本人电子系,只为一学生。心喜计算机,小编以怡情。


给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问)

您在真实的面试中是否遇到过这个题? 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值