从零开始的LC刷题(24): Binary Tree Level Order Traversal II

    xiaoxiao2022-07-07  226

    原题:

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

    For example: Given binary tree [3,9,20,null,null,15,7],

    3 / \ 9 20 / \ 15 7

     

    return its bottom-up level order traversal as:

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

    原题说法有点绕,意思是从最后一层开始往上逐层按层存储在vector容器中最后返回容器,想到先序遍历(后序遍历不行因为不知道二叉树的深度),最后reverse一下vector就行(不得不感叹vector的便利),不过递归调用速度虽然不错但是内存占用一直比较高,结果:

    Success

    Runtime: 4 ms, faster than 99.21% of C++ online submissions for Binary Tree Level Order Traversal II.

    Memory Usage: 15.5 MB, less than 6.41% of C++ online submissions for Binary Tree Level Order Traversal II.

    代码:

    /** * 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>> r; int maxdepth=0; vector<vector<int>> levelOrderBottom(TreeNode* root) { dfs(root,1); reverse(r.begin(),r.end()); return r; } void dfs(TreeNode* root,int depth){ if (root!=NULL&&depth>maxdepth){maxdepth++;vector<int> newv;r.push_back(newv);} else if (root==NULL){return;} r[depth-1].push_back(root->val); dfs(root->left,depth+1); dfs(root->right,depth+1); return; } };

    改成循环调用以后内存情况好了点:

    Success

    Runtime: 0 ms, faster than 100.00% of C++ online submissions for Binary Tree Level Order Traversal II.

    Memory Usage: 13.8 MB, less than 84.07% of C++ online submissions for Binary Tree Level Order Traversal II.

    代码:

    /** * 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) { int maxdepth=-1; vector<vector<int>> r; if(root==NULL){return r;} vector<TreeNode*> queue; vector<int> queuedepth; queue.push_back(root); TreeNode* c=root; int depth=0; while(!queue.empty()){ if (depth>maxdepth){vector<int> newv;r.push_back(newv);maxdepth=depth;} r[depth].push_back(c->val); if(c->right!=NULL){queue.push_back(c->right);queuedepth.push_back(depth+1);} if(c->left!=NULL){c=c->left;depth++;continue;} else{c=queue.back(); queue.pop_back(); if(queue.empty()){break;} depth=queuedepth.back(); queuedepth.pop_back();} } reverse(r.begin(),r.end()); return r; } };

     

    最新回复(0)