Leetcode: Binary Tree Paths

来源:互联网 发布:oracle sql优化 编辑:程序博客网 时间:2024/05/01 12:21

Given a binary tree, return all root-to-leaf paths.

For example, given the following binary tree:

   1 /   \2     3 \  5

All root-to-leaf paths are:

["1->2->5", "1->3"]

以前遇到过这个题,还真是面试的时候,业界一个大公司, http://blog.csdn.net/ymhhym/article/details/21326879。

递归的很好写,当时几分钟搞定,非递归的鼓捣了很久,最终也没真正写出来。

/** * 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> result;        string path;        getPath(root, result, path);                return result;    }    void getPath(TreeNode* root, vector<string>& result, string path) {        if (root == nullptr) {            return;        }                if (!path.empty()) {            path.append("->");        }        path.append(to_string(root->val));        if (root->left == nullptr && root->right == nullptr) {            result.push_back(path);        }        else {            if (root->left != nullptr) {                getPath(root->left, result, path);            }            if (root->right != nullptr) {                getPath(root->right, result, path);            }        }    }    };

非递归的,采用后续遍历。

/** * 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> result;        string path;        TreeNode* prev = nullptr;        stack<TreeNode*> nodes;        while (root != nullptr || !nodes.empty()) {            while (root != nullptr) {                nodes.push(root);                if (!path.empty()) {                    path.append("->");                }                path.append(to_string(root->val));                root = root->left;            }                        if (!nodes.empty()) {                root = nodes.top();                if (root->right == nullptr || root->right == prev) {                    nodes.pop();                    if (root->left == nullptr && root->right == nullptr) {                        result.push_back(path);                    }                    auto pos = path.rfind("->");                    if (pos != string::npos) {                        path = path.substr(0, pos);                    }                    else {                        path = "";                    }                    prev = root;                    root = nullptr;                }                else {                    root = root->right;                }            }        }                return result;    }    };


0 0
原创粉丝点击