leetcode107. 二叉树的层次遍历 II

传送门

题目:给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回其自底向上的层次遍历为:

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

方法1. 常规层次遍历,额外变量存储每层节点数

public List<List<Integer>> levelOrderBottom(TreeNode root) {// 正向遍历,最后反转ans
        List<List<Integer>> ans = new LinkedList<>();
        if (root == null) return ans;
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(root);
        int curLevelCount = 1, nextLevelCount = 1;
        while (!que.isEmpty()) {
            List<Integer> curLevelNode = new ArrayList<>(); //存每层节点数
            curLevelCount = nextLevelCount;
            nextLevelCount = 0;
            while (!que.isEmpty() && curLevelCount-- > 0) {
                TreeNode cur = que.poll();
                curLevelNode.add(cur.val);

                if (cur.left != null) {
                    nextLevelCount++;
                    que.offer(cur.left);
                }
                if (cur.right != null) {
                    nextLevelCount++;
                    que.offer(cur.right);
                }
            }
            ans.add(curLevelNode);
            
        }
        Collections.reverse(ans); // 反转层次遍历的列表
        return ans;
}

方法2. 优化版本

别一直用List声明ans了,可以个性化,用LinkedList 就能用addFirst() 这种方法了。

直接把每层节点加入ans头插,就不用在最后反转了。
另外,每次遍历这一层之前,队列当前的元素个数就是这一层节点个数,不用额外变量存。
注意,for循环i的上限界不能用que.size() 因为在遍历这一层的时候,下一层节点也会动态加入。

public List<List<Integer>> levelOrderBottom(TreeNode root) {
    // 直接用LinkedList定义,不用List,这样就能直接ans.addFirst()了
    LinkedList<List<Integer>> ans = new LinkedList<>();
    if (root == null) return ans;
    Queue<TreeNode> que = new LinkedList<>();
    que.offer(root);
    while (!que.isEmpty()) {
        List<Integer> curLevelNode = new ArrayList<>();
        int curLevelCount = que.size(); // 队列当前元素数就是当前层节点数
        for (int i = 0; i < curLevelCount; ++i) {
            TreeNode cur = que.poll();
            curLevelNode.add(cur.val);
            if (cur.left != null) 
                que.offer(cur.left);

            if (cur.right != null) 
                que.offer(cur.right);
        }
        ans.addFirst(curLevelNode);
    }
    return ans;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于二叉树层次遍历,可以使用队列来实现。首先,将二叉树的根结点入队,然后循环执行以下操作:出队并访问出队结点,如果有左孩子结点,将左孩子结点入队;如果有右孩子结点,将右孩子结点入队。直到队列为空为止。 例如,给定二叉树 [3,9,20,null,null,15,7,按层次遍历的结果为: 3 9 20 15 7 其中,根结点3位于第一层,左孩子结点9和右孩子结点20位于第二层,左孩子结点15和右孩子结点7位于第三层。 这种自顶向下的层次遍历可以通过队列结构来实现,每次出队一个结点,访问该结点,并将其子结点入队,直到队列为空。这样可以保证从叶子节点所在层到根节点所在的层,逐层从左向右遍历。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [leetcode107. 二叉树层次遍历 II](https://download.csdn.net/download/weixin_38551059/13759244)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [二叉树层次遍历](https://blog.csdn.net/qq_44722109/article/details/126292665)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值