【每天一题】LeetCode 0107. 自底向上层遍历二叉树 - Go语言中文社区

【每天一题】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);
    }
};
版权声明:本文来源博客园,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.cnblogs.com/jiau/p/11690788.html
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-11-16 23:41:50
  • 阅读 ( 1249 )
  • 分类:算法

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢