木落长安rr

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.

Note: A leaf is a node with no children.

Example:

Given the below binary tree and sum = 22,

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

return true, as there exist a root-to-leaf path 5->4->11->2 which sum is 22.

方法一:利用深度优先搜索DFS的方法来遍历每一条完整的路径,利用递归方法不停地找子节点的左右结点。首先,若输入的是空节点,则返回false,若是为叶子结点且其值为当下的值时,则返回true,否则,只要子节点的左右结点中任一结点可行则返回true。(C++)

1 bool hasPathSum(TreeNode* root, int sum) {
2         if(!root)
3             return false;
4         if(root->val==sum&&!root->left&&!root->right)
5             return true;
6         return hasPathSum(root->left,sum-root->val)||hasPathSum(root->right,sum-root->val);
7     }

方法二:使用遍历的方法,每一个结点都加上其父结点的值,如果到叶子结点时,其值等于sum,就存在一条符合题意的路径,在这道题中,不一定非要右结点先入栈,左右顺序不影响结果。(C++)

 1  bool hasPathSum(TreeNode* root, int sum) {
 2         if(!root)
 3             return false;
 4         stack<TreeNode*> s{{root}};
 5         while(!s.empty()){
 6             TreeNode* tmp=s.top();
 7             s.pop();
 8             if(!tmp->left&&!tmp->right){
 9                 if(tmp->val==sum)
10                     return true;
11             }
12             if(tmp->right){
13                 tmp->right->val+=tmp->val;
14                 s.push(tmp->right);
15             }
16             if(tmp->left){
17                 tmp->left->val+=tmp->val;
18                 s.push(tmp->left);
19             }
20         }
21         return false;
22     }

 

posted on 2019-04-12 21:21  木落长安rr  阅读(138)  评论(0编辑  收藏  举报