Leetcode 102. Binary Tree Level Order Traversal


Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).

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

    3
   / \
  9  20
    /  \
   15   7

return its level order traversal as:

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


由題意容易知道最好是利用層序遍歷的分層迭代、層內遞歸來實現,於是寫下如下代碼:

/**
 * 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>> levelOrder(TreeNode* root) {
        vector<vector<int>>res;
        if(root==NULL)return res;
        int height=0;
        height=depth(root);
       for(int i=1;i<=height;i++){
           vector<int>sres;
           levelorderTraverse(root,sres,i);
           res.push_back(sres);
       }
        
        return res;
    }
    
    void levelorderTraverse(TreeNode *root,vector<int>&smallresult,int depth)
    {
        if(root==NULL||depth<1)return;
        if(depth==1){
            smallresult.push_back(root->val);
            return;
        }
        levelorderTraverse(root->left,smallresult,depth-1);
        levelorderTraverse(root->right,smallresult,depth-1);
    }
    int depth(TreeNode *root){
        if(root==NULL)return 0;
        return (depth(root->left)>depth(root->right))?(depth(root->left)+1):(depth(root->right)+1);
    }
    
};

可惜最後33/34的test case通過,最後TLE了,可見遞歸運用太多。。超時,後優化爲如下代碼:

/**
 * 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>> levelOrder(TreeNode* root) {
        vector<vector<int>> result;
        level(result,root,1);
        //reverse(result.begin(),result.end());

        return result;
    }

    void level(vector<vector<int>> &result,TreeNode *root,int num)
    {
        if(root==NULL)
            return;
        if(num>result.size())
            result.push_back(vector<int>());

        result[num-1].push_back(root->val);
        level(result,root->left,num+1);
        level(result,root->right,num+1);
    }
};

順利通過
發佈了38 篇原創文章 · 獲贊 9 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章