算法总结 - 树 - 遍历 - 常见算法题类型

Traversal(遍历)

1. 基本层级遍历

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

非常朴实的层级遍历,之后的题型都由此演化而来。
直观的想法是利用queue做BFS。

public List<List<Integer>> levelOrder(TreeNode root) {
   
    List<List<Integer>> res = new ArrayList<>();
    if (root == null) return res;
    
    Deque<TreeNode> que = new ArrayDeque<>();
    que.offer(root);
    
    while(!que.isEmpty()){
   
        int size = que.size();
        List<Integer> list = new ArrayList<>();
        for (int i= 0; i < size; i++){
   
            TreeNode cur = que.poll();
            list.add(cur.val);
            if (cur.left != null) que.offer(cur.left);
            if (cur.right != null) que.offer(cur.right);
        }
        res.add(list);
    }
    return res;
}

当然,如果要使用DFS也可以,但是得引入一个变量来存当前节点该塞到哪一层。
题外话,如果一个题可以既用BFS和DFS解,最好把两种算法都吃透。我遇到过面试的时候,口头表述的是DFS解法,但是面试官故意让用BFS实现的情况。

class Solution {
   
    public List<List<Integer>> levelOrder(TreeNode root) {
   
        List<List<Integer>> res = new ArrayList<>();
        dfs(root, res, 0);
        return res;
    }
    
    public void dfs(TreeNode root, List<List<Integer>> res, int depth){
   
        if(root == null) return;
        if(res.size() == depth){
   
            res.add(new ArrayList<Integer>());
        }
        res.get(depth).add(root.val);
        dfs(root.left, res, depth+1);
        dfs(root.right, res, depth+1);
    }
}

相似题型
429. N-ary Tree Level Order Traversal


2.改变层级遍历顺序

107. Binary Tree Level Order Traversal II
Given a binary tree, return the bottom-up level order traversal of its nodes’ values. (ie, from left to right, level by level from leaf to root).

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

    3
   / \
  9  20
    /  \
   15   7

return its bottom-up level order traversal as:

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

也就是倒序输出每层,可以用stack或者list的add(0,元素)实现。
TC: O(n), SC: O(n)

//BFS
public List<List<Integer>> levelOrderBottom(TreeNode root) {
   
    Queue<TreeNode> queue = new LinkedList<TreeNode>();
    List<List<Integer>> wrapList = new LinkedList<List<Integer>>();
    
    if(root == null) return wrapList;
    
    queue.offer(root<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值