剑指offer——面试题25:二叉树中和为某一值的路径(递归,深度优先搜索)
2015-08-17 15:51
645 查看
题目1:
输入一个二叉树和一个整数,判断这棵二叉树是否存在根节点到叶节点的路径上的所有节点的和等于这个整数
存在的话返回true
不存在的话返回false
思路1:
采用递归的思想来做,也可以叫做深度优先搜索的思想,不停的往下搜索,
每次输入这个结点root,这个结点之前的路径上的结点和passsum作为参数
若是该节点为叶子结点,则开始返回,将passsum+root->val与sum比较是否相等,然后返回bool值
若不为叶子结点,则往左右子树搜索,返回它们俩结果的或运算(因为只要有一条满足就可以了)。
下面是代码:
下面是思路1的拓展,将sum和target_sum都设为全局变量
思路2:
采用迭代的方法来实现深度优先搜索,即使用堆栈的方法。
每次压入栈的为一个新的结构体,一个是这个结点的指针吗、,一个是包含这个结点的之前的路径和
每次出栈一个结点后,压入这个结点的左右子结点(如果存在的话)
对于这个出栈的结点如果是叶节点的话,就进行判断。
题目2:
要求输出所有的和与这个值相等的路径
思路:
在上面的深度优先搜索的算法中将那个和改为一个路径的向量假如进去就可以了。
输入一个二叉树和一个整数,判断这棵二叉树是否存在根节点到叶节点的路径上的所有节点的和等于这个整数
存在的话返回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:
要求输出所有的和与这个值相等的路径
思路:
在上面的深度优先搜索的算法中将那个和改为一个路径的向量假如进去就可以了。
相关文章推荐
- 黑马程序员——集合的遍历
- 黑马程序员——JAVA——抽象类和接口
- 为什么程序员的业余项目大多都死了?
- 大公司的Java面试题集
- 大公司的Java面试题集
- Web前端面试题集锦
- IT人的职场该怎么走!!!
- 黑马程序员——JAVA——多线程
- 职场励志故事:950130000客服的人生,简单别样
- 950130000客服中心的职场故事:一个女孩子到底要不要活得那么拼?
- 敏捷程序员如何训练大脑
- Java, 基础(面试题)总结(分享-交流)
- 黑马程序员——集合(中)——TreeSet、泛型
- 黑马程序员——JAVA基础——集合
- 40个Java集合面试问题和答案
- 黑马程序员——JAVA基础——IO流
- 剑指offer_面试题25_二叉树中和为某一值的路径
- 黑马程序员——JAVA高新技术——反射
- 【转载】经典.net面试题目【为了笔试。。。。。】
- 黑马程序员——JAVA面向对象的特性:封装,继承,多态