zoukankan      html  css  js  c++  java
  • 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;
    };

  • 相关阅读:
    【IHttpHandler】在ASP.Net2.0中使用UrlRewritingNet实现链接重写
    【IHttpHandler】IHttpModule实现URL重写
    【IHttpHandler】使用IHttpHandler防盗链
    【IHttpHandler】HttpModule,HttpHandler,HttpHandlerFactory简单使用
    【IHttpHandler】HttpModule的认识
    【IHttpHandler】了解 IHttpHandler
    【MVC】ASP.NET MVC 请求生命周期
    【MVC】ASP.NET MVC HtmlHelper用法大全
    【MVC】ASP.NET MVC中实现多个按钮提交的几种方法
    【MVC】自定义ASP.NET MVC Html辅助方法
  • 原文地址:https://www.cnblogs.com/cnyulei/p/12149230.html
Copyright © 2011-2022 走看看