tree 102_107_872

102. Binary Tree Level Order Traversal

层序遍历二叉树,返回每一层的结点数,每一层放在一个列表中。

用递归法要记住在所层数:

public List<List<Integer>> levelOrder(TreeNode root) {
    if (root == null) return res;
    helper(root, 0);
    return res;
}

List<List<Integer>> res = new ArrayList<>();
public void helper(TreeNode root, int depth) {
    if (root == null) return;
    while (res.size() <= depth) res.add(new ArrayList<>());

    res.get(depth).add(root.val);
    helper(root.left, depth+1);
    helper(root.right, depth+1);
}

107. Binary Tree Level Order Traversal II

和上题一样,但是最下面一层放在第一排。

用了LinkedList直接将新的列表插在最前面,就不用最后再反转了:

public List<List<Integer>> levelOrderBottom(TreeNode root) {
    LinkedList<List<Integer>> res = new LinkedList<>();
    if (root == null) return res;

    Queue<TreeNode> queue = new LinkedList();
    queue.offer(root);
    while (!queue.isEmpty()) {
        int n = queue.size();
        List<Integer> row = new ArrayList<>();
        while (n > 0) {
            TreeNode temp = queue.poll();
            row.add(temp.val);
            if (temp.left != null)
                queue.offer(temp.left);
            if (temp.right != null)
                queue.offer(temp.right);
            n--;
        }
        res.addFirst(row);
    }

    return res;
}

872. Leaf-Similar Trees

给两棵树,判断他们的叶子结点组成的数组是否一致,顺序也要一致。

想了半天不创建列表的方法,最后发现行不通:

public boolean leafSimilar(TreeNode root1, TreeNode root2) {
    List<Integer> res1 = new ArrayList<>();
    List<Integer> res2 = new ArrayList<>();
    helper(root1, res1);
    helper(root2, res2);
    
    if (res2.size() != res1.size())
        return false;
    for (int i = 0; i < res1.size(); i++) {
        if (res1.get(i) != res2.get(i))
            return false;
    }
    return true;
}


public void helper(TreeNode root, List<Integer> leaf) {
    if (root == null)
        return;

    if (root.left == null && root.right == null)
        leaf.add(root.val);
    helper(root.left, leaf);
    helper(root.right, leaf);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值