LeetCode107. Binary Tree Level Order Traversal II题解

1. 题目描述

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).

2. 样例

Given binary tree [3,9,20,null,null,15,7]:
这里写图片描述
return its bottom-up level order traversal as:
这里写图片描述

3. 分析

题目的意思是给出了一棵二叉树,让我们从下到上,从左到右按照层次遍历的顺序将节点的数值存储进一个二维的vector里面。
一拿到题目,我能想到最简单最容易实现的算法就是:按照正常的层次遍历的顺序,将每一层的节点存进vector里面,然后调用reverse函数进行逆序,从而得到从下到上遍历的结果。
因为,二维的vector:第一维里面的元素是一个一个的vector,而第二维才是对应树的每一层的元素值,因此,仅仅对外层的第一维vector做reverse运算就可以得到从下至上从左至右的结果
分析到这里,我们就使用正常的层次遍历的非递归算法:利用队列node存储节点进行树的遍历,需要注意一点的是:我们设置了一个临时变量everyLevel用来存储每一层从左到右的节点数值,在每一层遍历结束后,将该vector推入最终的结果result的vector里面,然后对everyLevel进行清空操作。因此,判断每一行(即树的每一层)什么时候开始什么时候结束就显得很重要了。这里,我使用的方法是新建一个队列level专门存储当前正在访问的节点所在层数,随着node一起变化。与此同时再声明一个变量last_level用来存储上一个节点的层数,如果当前与上一个层数相同,则证明在同一行,如果不同则证明新开启了一层。
这里写图片描述

4. 源码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        vector<vector<int> > result;
        vector<int> everyLevel;
        queue<int> level;
        queue<TreeNode*> node;
        TreeNode* current_node = root;
        int current_level = 0;
        int last_level = 0;
        if (root != NULL) {
            level.push(current_level);
            node.push(current_node);
            while(!node.empty()) {
                current_node = node.front();
                current_level = level.front();
                node.pop();
                level.pop();
                if (current_level > last_level) {
                    last_level = current_level;
                    result.push_back(everyLevel);
                    everyLevel.clear();
                    everyLevel.push_back(current_node->val);
                }
                else {
                    everyLevel.push_back(current_node->val);
                }

                if (current_node->left != NULL) {
                    node.push(current_node->left);
                    level.push(current_level+1);
                }
                if (current_node->right != NULL) {
                    node.push(current_node->right);
                    level.push(current_level+1);
                }
            }
            result.push_back(everyLevel);
        }
        reverse(result.begin(), result.end());
        return result;
    }
};

5. 心得

本次题目虽然难度为medium,但是通过率不到40%,是BFS层次遍历的一个变形,我看见还有一个题目102.Binary Tree Level Order Traversal直接就是返回正常的层次遍历节点情况,那么就无需调用reverse这一步骤了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值