(树)输出或者存储二叉树中每一行的节点值

  • 题目:https://www.nowcoder.com/practice/d8566e765c8142b78438c133822b5118?tpId=46&tqId=29071&tPage=3&rp=3&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking
  • 思路:
    • 这个题目的主要思路就是利用队列来进行解决。从顶部到尾部,对每一层将每一层的节点放入队列中,然后在这一层中将队列中的每个节点保存在一个vector中,并且判断这个节点是否有左右子节点,将他们放入队列(这样就将下一层的所有节点放入了队列中),依次处理每一层。然后将每一层的vector'放入二维数组中即可。


  • 代码
    /**
     * Definition for binary tree
     * 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) {
            int depth = Depth(root);
            vector <vector<int> > bottom;
            if (root == NULL)
                return bottom;
            
            deque <TreeNode *> dq;
            dq.push_back(root);
            /*
                这里是利用队列来进行存储每一行的节点,进队列出队列,主要思路就是利用当前的遍历到当前节点,就讲它的左右子节点
                进入队列,然后再将这一个队列的当前行的元素进入vector中然后在进入二维数组中
            */
            while (!dq.empty()){
                int low = 0;
                int high = dq.size();//计算当前队列中元素的个数,这个就是每一行的元素个数
                vector<int> tmp;
                while (low++ < high){
                    TreeNode *cur = dq.front();
                    dq.pop_front();
                    tmp.push_back(cur->val);
                    if (cur->left) dq.push_back(cur->left);
                    if (cur->right) dq.push_back(cur->right);
                }
                bottom.push_back(tmp);
            }
            reverse(bottom.begin(), bottom.end());//翻转函数,实现翻转
            return bottom;
        }
        //计算树的深度函数
        int Depth(TreeNode *root){
            if (root == NULL)
                return 0;
            int left = left + Depth(root->left);
            int right = right + Depth(root->right);
            
            return left>right?left:right;
        }
    };
原文地址:https://www.cnblogs.com/Kobe10/p/6341279.html