0
点赞
收藏
分享

微信扫一扫

5.4.3二叉树的路径和

微笑沉默 2022-01-12 阅读 38

文章目录

1.题目

  • 题目要求
  • eg:
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.
  • 递归写法要求:
    (1)递归终止条件:用深度优先算法 DFS 的思想来遍历每一条完整的路径。即利用递归不停找子结点的左右子结点;
    首先,如果输入的是一个空结点,则直接返回 false;
    如果如果输入的只有一个根结点,则比较当前根结点的值和参数 sum 值是否相同,若相同,返回 true,否则 false
    (2)由于函数的返回值是 Ture/False,可以同时两个方向一起递归,中间用或 || 连接,
    只要有一个是 True,整个结果就是 True。
    递归左右结点时,这时候的 sum 值应该是原 sum 值减去当前结点的值
  • 迭代法:使用前序遍历
    先序遍历二叉树,左右子结点都需要加上其父结点值,这样当遍历到叶结点时,如果和 sum 相等了,那么就说明一定有一条从 root 过来的路径

2.代码

递归法
class Solution{
public:
	bool hasPathSum(TreeNode* root, int sum)
	{
		if (!root) return false;
		if (!root->left && !root->right && root->val == sum ) return true;
		return hasPathSum(root->left,sum-root->val) || hasPathSum(root->right,sum-root->val);
	}
};



迭代法:前序遍历
class Solution{
public:
	bool hasPathSum(TreeNode* root, int sum)
	{
		stack<TreeNode*> stak;
		stak.push(root);
		while (!stak.empty())
		{
			TreeNode* node=stak.top();stak.pop();
			if (!node->left && !node->right && node->val == sum) return true;
			if (node->right)
			{
				node->right->val+=node->val;
				stak.push(node->right);
			}
				
			if (node->left)
			{
				node->right->left+=node->val;
				stak.push(node->left);	
			}
		}

		return false;
	}
};


举报

相关推荐

0 条评论