【LeetCode】C++ :簡單題 - 樹 112. 路徑總和
阿新 • • 發佈:2021-01-09
難度簡單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; } };