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;

        
    }
};

  

原文地址:https://www.cnblogs.com/maizi-1993/p/5883218.html