个人记录-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]
]

这个问题需要我们按照深度逐渐递增的顺序,
从左到右依次输出每个深度对应节点的值。

代码示例:
这个问题比较容易的想法是:
在保存每一层节点值的同时,保存这一层的节点。
然后,在要输出下一层节点值时,
按照上一层节点的顺序,以此取值。

例如:

/**
 * 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) {
       //用于保存结果
       List<List<Integer>> rst = new ArrayList<>();

        if (root != null) {
            //记录这一层的值
            List<Integer> valList = new ArrayList<>();
            valList.add(root.val);
            rst.add(valList);

            //保存这一层的节点
            List<TreeNode> nodeList = new ArrayList<>();
            nodeList.add(root);

            //递归
            innerHelper(rst, nodeList);
        }

        return rst;
    }

    private void innerHelper(List<List<Integer>> rst, List<TreeNode> lastNodeList) {
        //上一层有节点
        if (lastNodeList.size() > 0) {
            //用于保存这一层的值
            List<Integer> valList = new ArrayList<>();
            //用于保存这一层的节点
            List<TreeNode> nodeList = new ArrayList<>();

            //按照上一层节点的顺序,从左到右以此保存子节点的值和节点本身
            for (TreeNode node: lastNodeList) {
                if (node != null) {
                    //先左
                    if (node.left != null) {
                        valList.add(node.left.val);
                        nodeList.add(node.left);
                    }

                    //后右
                    if (node.right != null) {
                        valList.add(node.right.val);
                        nodeList.add(node.right);
                    }
                }
            }

            //下一层有实际信息时,才继续递归
            if (nodeList.size() > 0) {
                rst.add(valList);
                innerHelper(rst, nodeList);
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值