[102] Binary Tree Level Order Traversal

1. 题目描述

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]
]

题目的意思为,给定一个二叉树,返回一个二维List,每个list中保存二叉树中对应层的节点。读题要仔细,一开始我就只看图理解成了树的广度优先遍历:(。

2. 解题思路

输的广度优先遍历的变种题,在原使用队列实现的广度优先遍历算法中添加了一个标记,将下一层孩子划分成一段。因为栈里会同时存在当前层节点,和下一层节点,需要有个标记记录他们的分割处。

3. Code

// util包真有用呀
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

public class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        if(root == null)
        {
//          return null;
            // 一开始觉得树返回一个空就好了,结果是要返回一个空的List
            return new ArrayList<>();
        }
        List<List<Integer>> result = new ArrayList<>();
        Queue<TreeNode> tempQueue = new LinkedList<>();
        // offer代替add,在超出队列最大长度时不会抛出异常
        tempQueue.offer(root);
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(root.val);
        result.add(arrayList);
        int num = tempQueue.size();
        while(!num.size() == 0)
        {
            // 新建一个数组,保存下一层的结果
            ArrayList<Integer> newList = new ArrayList<>();
            while(num > 0) {
                // poll代替remove,队列为空时返回null不抛出异常
                TreeNode tempNode = tempQueue.poll();
                --num;
                // 插入当前节点的左右孩子,和其值
                if (tempNode.left != null) {
                    // 队列加入左节点
                    tempQueue.offer(tempNode.left);
                    // 结果中加入左节点值
                    newList.add(tempNode.left.val);
                }
                if (tempNode.right != null) {
                    tempQueue.offer(tempNode.right);
                    newList.add(tempNode.right.val);
                }
            }
            // 和下层孩子节点分割位置
            num = tempQueue.size();
            if (!newList.isEmpty())result.add(newList);
        }
        return result;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值