leetcode題庫--112路徑總和

  1. 路徑總和
    給定一個二叉樹和一個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。

說明: 葉子節點是指沒有子節點的節點。
思路:
思路比較簡單,就是遞歸將前面的和傳下去,加上自身的值判斷是否等於目標和。

    bool hasPathSum(TreeNode* root, int sum) {

        if(dfs(root, sum, 0))
        {
            return true;
        }
        return false;
    }

    bool dfs(TreeNode* root, int target, int sum)
    {
        if(root == nullptr)
        {
            return false;
        }

        sum += root->val;
        if(sum == target)
        {
            if(!root->left && !root->right)
            return true;
        }
        return dfs(root->left, target, sum) || dfs(root->right, target, sum);

    }
  1. 路徑總和 II
    給定一個二叉樹和一個目標和,找到所有從根節點到葉子節點路徑總和等於給定目標和的路徑。

說明: 葉子節點是指沒有子節點的節點。

示例:
給定如下二叉樹,以及目標和 sum = 22,

          5
         / \
        4   8
       /   / \
      11  13  4
     /  \    / \
    7    2  5   1
返回:

[
   [5,4,11,2],
   [5,8,4,5]
]

思路:
和上一題類似,就是需要用一個vector來記錄當前的路徑,滿足條件就放入結果中。由於需要找到所有的路徑,需要遍歷所有節點。

vector<vector<int>> pathSum(TreeNode* root, int sum) {
        vector<int> path;
        dfspath(root, sum, path, 0);

        return rec;
        
    }

    void dfspath(TreeNode* root, int target, vector<int>& path, int sum)
    {
        if(root==nullptr)return;
        sum += root->val;
        path.push_back(root->val);
        if(sum == target)
        {
            if(!root->left && !root->right)
            {
                rec.push_back(path);
                path.pop_back();
                return;
            }
        }
        
        if(root->left)
        {
            dfspath(root->left, target, path, sum);
        }
        
        if(root->right)
        {
            dfspath(root->right, target, path, sum);
        }

        path.pop_back();    //加入路徑,  函數結束就要刪除路徑

    }

    vector<vector<int>> rec;
  1. 路徑總和 III

給定一個二叉樹,它的每個結點都存放着一個整數值。

找出路徑和等於給定數值的路徑總數。

路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的(只能從父節點到子節點)。

二叉樹不超過1000個節點,且節點數值範圍是 [-1000000,1000000] 的整數。

示例:

root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8

      10
     /  \
    5   -3
   / \    \
  3   2   11
 / \   \
3  -2   1

返回 3。和等於 8 的路徑有:

1.  5 -> 3
2.  5 -> 2 -> 1
3.  -3 -> 11

思路:
由於不需要根節點和葉子節點的約束,因此在遍歷每個節點的時候都要判斷從祖先節點到該節點是否有滿足條件的路徑。也很好計算,將根節點到每個節點的路徑和,記錄下來,然後判斷sum - target == path[i]。sum 是當前節點的路徑和,target是目標路徑和,path[i]是遍歷路徑的每個節點的路徑和。這個思路和兩數之和類似。

int pathSum(TreeNode* root, int sum) {

        vector<int> path;
        path.push_back(0);       //加0 , 爲了後面計算sum - target == path[i],將所有路徑遍歷
        dfspath(root, sum, path, 0);

        return ans;

    }

    void dfspath(TreeNode* root, int target, vector<int>& path, int sum)
    {
        if(root==nullptr)
        return ;

        sum += root->val;
        for(int i = 0; i < path.size(); ++i)
        {
            if(sum - target == path[i])
            {
                ans++;
            }
        }

        path.push_back(sum);

        if(root->left)
        {
            dfspath(root->left, target, path, sum);
        }

        if(root->right)
        {
            dfspath(root->right, target, path, sum);
        }

        path.pop_back();

    }

    int ans = 0;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章