劍指34 二叉樹中和為某一值的路徑
阿新 • • 發佈:2020-07-04
輸入一棵二叉樹和一個整數,打印出二叉樹中節點值的和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。
示例:
給定如下二叉樹,以及目標和sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
提示:
節點總數 <= 10000
這題採用遞迴,如果到了葉節點同時路徑和與目標相等就可以輸出。但是需要注意的是,題目沒有限制目標值和節點值的正負,所以節點可以有正有負,在沒有到達葉子結點之前不能提前判斷該路徑合不合法。此外注意處理根節點為空指標的情況。
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 vector<vector<int>> ret; 13 vector<vector<int>> pathSum(TreeNode* root, int sum) { 14 if(root==nullptr) 15 return ret; 16 recursive_find({},root,sum,0); 17 return ret; 18 } 19 20 void recursive_find(vector<int> partial_ret, TreeNode* curnode,int target, int cursum){ 21 if(curnode->left==nullptr && curnode->right==nullptr){22 if(curnode->val==target-cursum){ 23 partial_ret.push_back(curnode->val); 24 ret.push_back(partial_ret); 25 return ; 26 } 27 else 28 return; 29 } 30 cursum+=curnode->val; 31 partial_ret.push_back(curnode->val); 32 if(curnode->left!=nullptr) 33 recursive_find(partial_ret,curnode->left,target,cursum); 34 if(curnode->right!=nullptr) 35 recursive_find(partial_ret,curnode->right,target,cursum); 36 return ; 37 } 38 39 };
這裡傳入的partial_ret是傳值,這樣好處是返回前不用做pop_back。書上的做法是傳引用,這樣的好處是傳的只是一個指標,而且不用多次複製,所以遞迴時節省了棧的空間和複製的時間,這麼看來傳引用更加高效。