zoukankan      html  css  js  c++  java
  • leetcode 257

    查找二叉树中根节点到叶子节点的所有路径:

    本题有两种解法:递归解法和非递归解法,递归解法请参考:http://blog.csdn.net/booirror/article/details/47733175

    该博主对递归算法的讲解不多,但是代码还是很容易看懂的。

    刚刚又看到了一个代码写的更好、更简洁的版本,这个版本应该是我看到的所有递归解法中代码最简洁的一个版本,学习了。网址为:http://www.2cto.com/kf/201601/456116.html

    非递归解法如下:

    1、设置一个二维数组,基本元素是树上的节点,其一维数组表示路径

    2、用根节点初始化一个一维数组(第一条路径),并将这个数组作为二维数组的第一个元素

    3、遍历这个二维数组,直至该二维数组为空

      对于该二维数组中的每条路径,如果该路径上的最后一个节点为叶子节点,将该路径转换为字符串形式并从该二维数组中删除。

      如果该路径上最后一个节点的只有一个孩子节点,将该孩子节点加入这个路径中

      如果该路径上最后一个节点有两个孩子节点,拷贝该路径插入到紧挨着这个路径之后的位置,将左孩子节点加入原路径,将右孩子节点加入拷贝生成的路径。

    代码如下:

    /**
     * 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) {
            
        vector<string> res(0);
        if(!root)
            return res;
    
        vector< vector<TreeNode *> > ptr_res;
        vector<TreeNode *> ptr_temp(1, root);
        ptr_res.push_back(ptr_temp);
    
        while(!ptr_res.empty())
        {
            for(auto i = ptr_res.begin(); i != ptr_res.end(); i ++)
            {
                auto j = i->at(i->size() - 1);
                if(! j->left && ! j->right)
                {
                    string s;
                    for(auto  j = i->begin(); j != i->end(); j ++)
                    {
                        char num[8];
                        sprintf(num, "%d", (*j)->val);
                        string temp(num);
                        if(j == i->begin())
                            s += temp;
                        else
                        {
                            string ch("->");
                            s += ch;
                            s += temp;
                        }
                    }
    
                    res.push_back(s);
                    ptr_res.erase(i);
                    break;
                }
                else if(j->left && j->right)
                {
                    vector<TreeNode *> path_temp(i->begin(), i->end());
                    i->push_back(j->left);
                    path_temp.push_back(j->right);
                    ptr_res.insert(++i, path_temp);
                    break;
                }
    
                else
                {
                    if(j->left)
                        i->push_back(j->left);
                    else
                        i->push_back(j->right);
                    break;
                }
    
            }
    
        }
    
        return res;
    
            
        }
    };
    

      

  • 相关阅读:
    linux 中的./configuration --prefix=安装路径 的用法(指定源码安装方式的安装路基)
    深入了解Activiti工作流流程定义
    ResultCode 自定义错误状态码
    maven和gradle对比
    js中的prototype原型解析
    json字符串的标准格式
    迷茫于Hibernate/JPA的人提一些建议。
    ModelDriven 和 Preparable 拦截器
    Spring中bean的scope
    spring配置文件详解以及beans:beans标签
  • 原文地址:https://www.cnblogs.com/maizi-1993/p/5883218.html
Copyright © 2011-2022 走看看