LeetCode 102. Binary Tree Level Order Traversal

Given a binary tree, return the level order traversal of its nodes’ values. (ie, from left to right, level by level).

For example:
Given binary tree [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

return its level order traversal as:

[
  [3],
  [9,20],
  [15,7]
]

本题和中序遍历有一点区别,就是程序需要知道当前所在的层

如果不用队列,则很容易想到存储每一行的节点的方法

代码如下

public List<List<Integer>> levelOrder(TreeNode root) {
        if (root == null) {
            return null;
        }
        //结果list
        List<List<Integer>> re = new ArrayList<List<Integer>>();
        //
        List<TreeNode> nodesList = new ArrayList<TreeNode>();
        nodesList.add(root);
        while (nodesList != null) {
            List<TreeNode> tmpList = new ArrayList<TreeNode>();
            List<Integer> integerList = new ArrayList<Integer>();
            for (TreeNode treeNode : nodesList) {
                integerList.add(treeNode.val);
                if (treeNode.left != null) {
                    tmpList.add(treeNode.left);
                }
                if (treeNode.right != null) {
                    tmpList.add(treeNode.right);
                }
            }
            re.add(integerList);
            nodesList = tmpList;
        }

        return re;



    }

难点在于使用队列进行中序遍历时该如何记录所在行

1.因为第一层只有一个节点,因此第二次就将null入队
2.每当访问到null时,说明进入了下一行,于是将null再次入队,并进行下一次循环

注意:如果访问到null时队列已经空了就不用在加入null,这样的话会造成死循环

java代码如下

public List<List<Integer>> levelOrder2(TreeNode root){

        List<List<Integer>> re = new ArrayList<List<Integer>>();
        Queue<TreeNode> treeNodeQueue = new LinkedList<TreeNode>();

        if (root == null) {
            return re;
        }
        treeNodeQueue.add(root);
        treeNodeQueue.add(null);

        List<Integer> integerList = new ArrayList<Integer>();
        while (treeNodeQueue.size() != 0) {
            TreeNode now = treeNodeQueue.poll();
            //空标识,将整行加入
            if (now == null) {
                re.add(integerList);
                integerList = new ArrayList<Integer>();
                if(treeNodeQueue.size()!=0) {
                    treeNodeQueue.add(null);
                }
                continue;

            }
            integerList.add(now.val);
            TreeNode left = now.left;
            TreeNode right = now.right;
            if (left != null) {
                treeNodeQueue.add(left);
            }
            if (right != null) {
                treeNodeQueue.add(right);
            }


        }
        return re;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值