1. 程式人生 > 其它 >【LeetCode】C++ :簡單題 - 樹 112. 路徑總和

【LeetCode】C++ :簡單題 - 樹 112. 路徑總和

技術標籤:LeetCode二叉樹演算法佇列leetcode

112. 路徑總和

難度簡單493

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

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

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

              5
             / \
            4   8
           /   / \
          11  13  4
         /  \      \
        7    2      1

返回true, 因為存在目標和為 22 的根節點到葉子節點的路徑5->4->11->2

通過次數

這題比我想象中難好多,但是很不錯!可能是因為我沒有理解好題意,一開始單純的想著層序遍歷的模板(哈哈,我太可笑了,還想著模板),然後發現寫著寫著有點邏輯不清,才發現不對。

實際上,這道題還是層序遍歷的方法,不同之處在於while迴圈內部不再是for迴圈,而改成了這裡的條件判斷。我一度試圖用for迴圈但是不可行,這裡要分別根據左右孩子來判斷所要加上的值是哪個,單純的迴圈沒有辦法分清楚具體要加上哪個值,這樣從上到下遍歷值就不會錯的。

然後總結一點:

層序遍歷方法的程式碼中,下一層的節點一定是在上一層就加到隊列當中,並且加到佇列的條件是這個節點的左右節點是否為空,如果不為空則加入到佇列中。

因為容易忘記,所以就寫的很具體啦

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool hasPathSum(TreeNode* root, int sum) {
        queue<TreeNode*> node;
        queue<int> vals;
        if(root == NULL){
            return false;
        }else{
            node.push(root);
            vals.push(root->val);
        }
        while(!node.empty()){
            TreeNode* nodeTmp = node.front();
            int valTemp = vals.front();
            node.pop();
            vals.pop();
            if(nodeTmp->left == NULL && nodeTmp->right == NULL){
                if(valTemp == sum){
                    return true;
                }
                continue;
            }
            if(nodeTmp->left != NULL){
                node.push(nodeTmp->left);
                vals.push(nodeTmp->left->val + valTemp);
            }
            if(nodeTmp->right != NULL){
                node.push(nodeTmp->right);
                vals.push(nodeTmp->right->val + valTemp);
            }
        }
        return false;
    }
};