1. 程式人生 > 其它 >劍指offer:二叉樹中和為某一值的路徑 c/c++

劍指offer:二叉樹中和為某一值的路徑 c/c++

技術標籤:劍指offerc++演算法dfs資料結構二叉樹

劍指offer:二叉樹中和為某一值的路徑 c/c++

題目描述

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

一些思路

根據題目要求 求路徑的和 可知應該進行樹的深度優先搜尋遍歷。

  1. 深度優先搜尋遍歷 ,深度優先搜尋遍歷使用的是遞迴的方法;
 //  關於DFS遍歷程式碼:
 void DFS(TreeNode* root){
 	if(root==NULL) return;
 	cout<<root->val;
if(root->left) DFS(root->left); if(root->right) DFS(root->right); }

2.判斷和為何值 , 每遍歷一個結點,使用所要求的整數減去該結點的值,若到葉結點時,剛好該值為0,則該路徑為所求路徑,將此路徑加入最後要返回的二維列表中。
3.,儲存結果 ,首先要設定兩個全域性變數,一個是一維陣列,用來儲存每次遍歷得到的路徑;還有一個二維陣列,用來儲存符合條件的路徑。
4. 對於不符合條件的路徑 ,每次遍歷完成一條路徑後,都會將最後的節點退出陣列,直到進入下一條路徑;(我自己想的是判斷符合條件以後,就將一維陣列的內容清空,再重新加進去,最後遞迴結束後也清空,但是這樣忽略了一個問題,下一條路徑中前面的節點也是前一條路徑的一些結點,因此不能完全清空,而是需要一個一個退出陣列)。

完整程式碼

class Solution {
public:
    vector<vector<int> >  vec;
    vector<int> path;
    vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
        DFS(root,expectNumber);
        return vec;
    }
    void DFS(TreeNode* root,int expectNumber){
        if(
root==NULL) return; expectNumber-=root->val; path.push_back(root->val); if(!expectNumber&&!root->left&&!root->right){ vec.push_back(path); } DFS(root->left,expectNumber); DFS(root->right,expectNumber); path.pop_back(); } };