title: 2019-8-21 二叉樹中和爲某一值的路徑
tags: 算法,每日一題,二叉樹
二叉樹中和爲某一值的路徑
1. 題目描述
輸入一顆二叉樹的根節點和一個整數,打印出二叉樹中結點值的和爲輸入整數的所有路徑。路徑定義爲從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意:在返回值的list中,數組長度大的數組靠前)
2.題目解析
2.1 思路解析
這題要注意兩點:1)尋找的路徑是從根節點到葉子節點的路徑,不用考慮中間路徑的情況;2)輸出結果最長的路徑在最前面。
方法一:使用深度優先的方式(對於二叉樹可以使用先序遍歷)遍歷二叉樹,得到每一條從根節點到葉子節點的路徑,找出符合條件的路徑。如何使得結果滿足第二個條件呢?找完之後再重新排序,可能有其它更好的方法,大家有想到的麻煩留言告知。
方法二:還是使用先序遍歷的方式,當到達某一深度之後走過的節點的累加和大於目標值了,那麼之後的節點就不用再訪問了,直接退出。否則繼續到葉子節點看路徑是否符合。(這種方式不可以,因爲節點的值可以是負數)
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
vector<int> trace;
vector<vector<int> > res;
if (root) dfsFindPath(root, expectNumber, trace, res);//要先判斷root不爲空
return res;
}
void dfsFindPath(TreeNode* root, int expectNumber, vector<int> &trace, vector<vector<int> >& res){
trace.push_back(root->val);
if(root->left == NULL && root->right == NULL){//葉子節點
if(expectNumber == root->val){
res.push_back(trace);
}
}else{//當前節點爲非葉子節點
if (root->left) dfsFindPath(root->left, expectNumber - root->val, trace, res);
if (root->right) dfsFindPath(root->right, expectNumber - root->val, trace, res);
}
if (!trace.empty()) trace.pop_back();//回退
}
};
更多關於編程和機器學習資料請關注FlyAI公衆號。