Leetcode 102:二叉树的层次遍历

题目描述

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

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

我的解法:前序遍历思想

我的解法用的是二叉树前序遍历思想,用非迭代的方式遍历每一个节点,同时把节点和深度信息以二维类型压入堆栈,再根据节点的深度信息把节点的val存到二维vector的对应位置。

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        TreeNode* p = root;
        stack<pair<TreeNode*, int>> s;
        int depth = 0;
        vector<vector<int>> m;
        int i = 0;
        
        while(p!= NULL || !s.empty())
        {
            while(p != NULL)
            {
                s.push(pair<TreeNode*, int> (p, ++depth));
                if(depth > m.size()) m.push_back(vector<int>());
                m[depth-1].push_back(p->val);
                p = p->left;
            }
            
            if(1)  // or if(!s.empty())
            {
                p = s.top().first; 
                depth = s.top().second;
                s.pop();
                p = p->right;
            }
        }
        return m;
    }
};

其它解法1:用队列对二叉树进行非递归的逐层遍历

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        if(!root) return {};
        vector<vector<int>> m;
        queue<TreeNode*> q; q.push(root);
        while(!q.empty())
        {
            vector<int> oneLevel;
            //for(int i = 0; i < q.size(); i++)  // 这个for语句是不对的,因为q的size一直在变
            for(int i = q.size(); i > 0; i--)
            {
                TreeNode* t = q.front(); q.pop();
                oneLevel.push_back(t->val);
                if(t->left) q.push(t->left);
                if(t->right) q.push(t->right);
            }
            m.push_back(oneLevel);
        }
        return m;
    }
};

其它解法2:用上层数信息的递归(有点像我的解法)

我的解法是前序遍历,对每一个节点都存储了其深度信息,也可以说是层数,然后把节点的val值存到对应层的vector位置即可。
此解法类似,类似递归的前序遍历,每一次递归都有一个level变量,即层数信息。

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        int level = 0;
        vector<vector<int>> res;
        levelOrder(root, level, res);
        return res;
    }

    void levelOrder(TreeNode* node, int level, vector<vector<int>> &res)
    {
        if(!node) return;
        if(res.size() == level) res.push_back({});
        res[level].push_back(node->val);
        levelOrder(node->left, level+1, res);
        levelOrder(node->right, level+1, res);
    }
};
发布了23 篇原创文章 · 获赞 9 · 访问量 1430

猜你喜欢

转载自blog.csdn.net/IcdKnight/article/details/104291182
今日推荐