【每天一题】LeetCode 0107. 自底向上层遍历二叉树


开源地址:点击该链接


题目描述

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

解题思路

*     由于需要按层进行组成,且是vector<vector<int>>
*     所以必须把每个层分开记录,另一点就是还要实现逆序
*     分层可以通过单独记录每层节点来完成,而逆序有两种方式
*     第一种是直接正序记录,然后再颠倒顺序
*     第二种是进行递归记录每层节点,最后在每层中添加数据
*     这样第二种就省去了第一种方法中颠倒顺序这步的操作
*

示例代码

/**
 * 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) {
        if (root == NULL)
            return {};

        vector<vector<int>> res;
        vector<TreeNode *> nodes;
        nodes.push_back(root);
        do_order(nodes, res);

        return res;
    }

    void do_order(vector<TreeNode *> &nodes, vector<vector<int>> &res) {
        if (nodes.size() == 0)
            return;

        vector<TreeNode *> next_level;
        for (int i=0; i<nodes.size(); i++) {
            if (nodes[i]->left)
                next_level.push_back(nodes[i]->left);
            if (nodes[i]->right)
                next_level.push_back(nodes[i]->right);
        }

        do_order(next_level, res);
        vector<int> temp;
        for (int i=0; i<nodes.size(); i++) {
            temp.push_back(nodes[i]->val);
        }
        res.push_back(temp);
    }
};
posted @ 2019-10-17 11:08  机器感知  阅读(315)  评论(0编辑  收藏  举报