題目(leecode T257):
給你一個二叉樹的根節點?root
?,按?任意順序?,返回所有從根節點到葉子節點的路徑。
葉子節點?是指沒有子節點的節點。
方法:本題需要對二叉樹中的所有路徑進行遍歷,并且是從根節點到所有的葉子節點。我們需要使用回溯的思想,回溯即是在找到每一條路徑的結束之后,我們需要返回上一個節點,繼續尋找是否有可行的路徑。同樣使用遍歷,我們需要傳入的參數是要處理的節點,path路徑和保存結果的result數組。迭代的終止條件是當我們到達了也是節點,即cur->left==NULL && cur->right==NULL。此時我們就可以處理種植邏輯,即把path路徑中的所有的元素都放到result數組中作為一條結果保存下來。其他情況下有左節點或右節點時我們都需要進行一次迭代與回溯。
題解:
?
class Solution {
private:void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) {path.push_back(cur->val); // 節點進入路徑進行保存if (cur->left == NULL && cur->right == NULL) { //處理到了葉子節點的情況string sPath;for (int i = 0; i < path.size() - 1; i++) { //將path中的路徑都作為string保存sPath += to_string(path[i]);sPath += "->";}sPath += to_string(path[path.size() - 1]); //將最后一個葉子節點也保存進去result.push_back(sPath);return;}if (cur->left) { // 左 traversal(cur->left, path, result);path.pop_back(); // 回溯}if (cur->right) { // 右traversal(cur->right, path, result);path.pop_back(); // 回溯}}public:vector<string> binaryTreePaths(TreeNode* root) {vector<string> result;vector<int> path;if (root == NULL) return result;traversal(root, path, result);return result;}
};