天天看點

Leetcode 257. 二叉樹的所有路徑

  對二叉樹的操作,很多情況都是基于其周遊操作進行的,是以,二叉樹的周遊操作應熟記于心! 

  

Leetcode 257. 二叉樹的所有路徑

   題目是說将二叉樹的所有路徑輸出,輸出形式有特定的要求,簡單的周遊操作即可完成任務!

  這裡,單獨寫了一個函數,用于将數組中的int類型,存至一個 vector<string> 類型的結果集中,void storeRes(vector<int> vc,vector<string> &res),int類型轉換成string類型,最簡單的方法是使用C++11标準的to_string()函數,代碼如下:

1 void storeRes(vector<int> vc,vector<string> &res){
 2         //函數功能:将vc中int類型的數字連接配接成字元串,存入res中
 3         string s="";
 4         for(int i=0;i<vc.size();i++)
 5         {
 6             if(i==vc.size()-1)
 7                 s+=(to_string(vc[i])+"");
 8             else
 9                 s+=(to_string(vc[i])+"->");
10         }
11         //cout<<"string s is "<<s<<endl;
12         res.push_back(s);
13     }      

  這裡我們使用函數的結果要改變最後的結果res,是以采用了引用類型的參數!

  基本思路是每次通路到葉子節點的時候,将已有的路徑進行輸出,可以用一個棧來存儲,每次回溯的時候,節點出棧,然後通路至葉子節點時,對棧結構進行周遊即可,這裡采用vector進行操作,其優勢在于,可以直接采用下标進行通路!

  筆記:

    vector結構删除末尾元素的三種方法pop_back(),erase()和remove函數

  1. 向量容器的成員函數pop_back()可以删除最後一個元素,而函數erase()可以删除由一個iterator指出的元素,也可以删除一個指定範圍的元素。
  2. 還可以采用通用算法remove()來删除vector容器中的元素,不同的是,采用remove一般情況下不會改變容器的大小,而pop_back()與erase()等成員函數會改變容器的大小。
  3. 另外,疊代器用于erase删除元素後,其後會失效,即不能再用該疊代器操作向量。

代碼如下:

/**
 * 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<string> binaryTreePaths(TreeNode* root) {
        if(root==nullptr)
            return res;
        //周遊,直到葉子節點
        vector<int> a;
        dfs(root,a);
        return res;
    }

    void dfs(TreeNode* root,vector<int> &a)
    {
        if(root==nullptr)
            return;
        //cout<<root->val<<endl;
        a.push_back(root->val);
        if(root->left!=nullptr)
            dfs(root->left,a);
        if(root->right!=nullptr)
            dfs(root->right,a);
        //此時為葉子節點
        if(root->left==nullptr && root->right==nullptr)
        {
            storeRes(a,res);
        }
        a.pop_back();  //彈出一個元素
        return;
    }

    void storeRes(vector<int> vc,vector<string> &res){
        //函數功能:将vc中int類型的數字連接配接成字元串,存入res中
        string s="";
        for(int i=0;i<vc.size();i++)
        {
            if(i==vc.size()-1)
                s+=(to_string(vc[i])+"");
            else
                s+=(to_string(vc[i])+"->");
        }
        //cout<<"string s is "<<s<<endl;
        res.push_back(s);
    }
private:
    vector<string> res;
};      
Leetcode 257. 二叉樹的所有路徑