您的位置:首页 > 职场人生

剑指offer——面试题25:二叉树中和为某一值的路径(递归,深度优先搜索)

2015-08-17 15:51 645 查看
题目1:

输入一个二叉树和一个整数,判断这棵二叉树是否存在根节点到叶节点的路径上的所有节点的和等于这个整数

存在的话返回true

不存在的话返回false

思路1:

采用递归的思想来做,也可以叫做深度优先搜索的思想,不停的往下搜索,

每次输入这个结点root,这个结点之前的路径上的结点和passsum作为参数

若是该节点为叶子结点,则开始返回,将passsum+root->val与sum比较是否相等,然后返回bool值

若不为叶子结点,则往左右子树搜索,返回它们俩结果的或运算(因为只要有一条满足就可以了)。

下面是代码:

bool ifequel(TreeNode* root,int passsum,int sum)
{
if(root==NULL)
return false;
//当为叶子结点时判断是否相等然后返回
if(root->left==NULL&&root->right==NULL)
return passsum+root->val==sum;
//若不为叶子结点则继续向下搜索,同时返回它们的结果的或运算。
if(root->left!=NULL||root->right!=NULL)
return ifequel(root->left,passsum+root->val,sum)||ifequel\
(root->right,passsum+root->val,sum);
}


下面是思路1的拓展,将sum和target_sum都设为全局变量

int target_sum;//到达这个结点之前的路径上所有点的和
int sum;//这个给定的整数
bool ifequel(TreeNode* root)
{
if(root==NULL)
return false;
target_sum=target_sum+root->val;
if(root->left==NULL&&root->right==NULL)
return target_sum==sum;
bool res1=ifequel(root->left);
bool res2=ifequel(root->right);
target_sum-=root->val;//target_sum是全局变量,计算完这个结点后需要减掉。
return res1||res2;
}


思路2:

采用迭代的方法来实现深度优先搜索,即使用堆栈的方法。

每次压入栈的为一个新的结构体,一个是这个结点的指针吗、,一个是包含这个结点的之前的路径和

每次出栈一个结点后,压入这个结点的左右子结点(如果存在的话)

对于这个出栈的结点如果是叶节点的话,就进行判断。

struct Node
{
TreeNode* root;
int tagetsum;
}
int sum;
bool ifequel(TreeNode* root)
{
if(root==NULL)
return false;
stack<Node> sta;
Node node;
node.root=root;
node.tagetsum=root->val;
while(!sta.empty())
{
TreeNode* temp;
int tempsum;
temp=sta.top().root;
tempsum=sta.top().tagetsum;

if(temp->left==NULL&&temp->right==NULL)
if(tempsum==sum)
return true;
if(temp->left!=NULL)
{
node.root=temp->left;
node.tagetsum=tempsum+temp->left->val;
sta.push(node);
}
if(temp->right!=NULL)
{
node.root=temp->left;
node.tagetsum=tempsum+temp->right->val;
sta.push(node);
}
}
return false;
}


题目2:

要求输出所有的和与这个值相等的路径

思路:

在上面的深度优先搜索的算法中将那个和改为一个路径的向量假如进去就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: