1. 程式人生 > 實用技巧 >劍指34 二叉樹中和為某一值的路徑

劍指34 二叉樹中和為某一值的路徑

輸入一棵二叉樹和一個整數,打印出二叉樹中節點值的和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。

示例:
給定如下二叉樹,以及目標和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。書上的做法是傳引用,這樣的好處是傳的只是一個指標,而且不用多次複製,所以遞迴時節省了棧的空間和複製的時間,這麼看來傳引用更加高效。