简直offer-第四章解决面试题思路(二叉树中和为某一值的路径)
题目:输入一颗二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点往下一直到叶子节点形成一条路径。
思路:很明显用前序遍历可以从根节点开始遍历到叶子节点,然后将遍历的节点添加到栈中进行保存路径。并且设置一个sum变量来记录节点值的和。通过对sum的操作来达到目的。
将抽象的问题具体化:

Java代码:
import java.util.Stack;
public class SumPath {
public class BinaryTreeNode{
int m_nValue;
BinaryTreeNode m_nLeft;
BinaryTreeNode m_nRight;
}
public BinaryTreeNode createBinaryTree(int[] pre,int start,int[] ord,int end,int length){
if(pre==null||ord==null||pre.length!=ord.length||length<=0)
return null;
int value=pre[start];
BinaryTreeNode root=new BinaryTreeNode();
root.m_nValue=value;
root.m_nLeft=root.m_nRight=null;
if(length==1){
if(pre[start]==ord[end])
return root;
else
throw new RuntimeException("inVaild put!");
}
//在中序遍历的序列中找到根节点
int i=0;
for(;i<length;i++){
if(ord[end-i]==value)
break;
}
if(i==length)
throw new RuntimeException("inVaild put!");
int left=length-i-1;
int right=i;
if(left>0)
root.m_nLeft=createBinaryTree(pre,start+1,ord,end-i-1,length-i-1);
if(right>0)
root.m_nRight=createBinaryTree(pre,start+length-i,ord,end,i);
return root;
}
public void sumPath(BinaryTreeNode root,int sum){
if(root==null)
return;
Stack<Integer> stack=new Stack<Integer>();
findPath(root,sum,stack);
}
public void findPath(BinaryTreeNode root, int sum, Stack<Integer> stack) {
if(root==null)
return;
//当遍历到叶子节点的时候,计算整个路径上的值是否为指定的值
if(root.m_nLeft==null&&root.m_nRight==null)
{
if(root.m_nValue==sum){
for(int i:stack)
System.out.print(i+",");
System.out.println(root.m_nValue);
}
}
stack.push(root.m_nValue);
//sum-root.m_nValue减去父节点的值,直到叶子几点,如果叶子节点等于剩下的值,那么就遍历成功。
if(root.m_nLeft!=null)
findPath(root.m_nLeft,sum-root.m_nValue,stack);
if(root.m_nRight!=null)
findPath(root.m_nRight,sum-root.m_nValue,stack);
stack.pop();
}
public static void main(String[] args){
int[] a={3,4,6,8,5,7,9};
int[] b={6,4,8,3,7,5,9};
SumPath sumPath=new SumPath();
BinaryTreeNode pHead=sumPath.createBinaryTree(a, 0, b, 6, a.length);
sumPath.sumPath(pHead, 15);
}
}
简直offer-第四章解决面试题思路(二叉树中和为某一值的路径)的更多相关文章
- 剑指offer-第四章解决面试题思路之总结
- 剑指offer-第四章解决面试题思路(字符串的排序)
题目:输入一个字符串,打印出该字符串的全排列. 思路:将整个字符串分成两部分,第一部分为一个字符,将该字符和该字符后面的字符(直到最后一个字符)依次交换,确定第一个字符:然后固定第一个字符,将后面的字 ...
- 剑指offer-第四章解决面试题思路(二叉收索树和双向链表)
题目:输入一个二叉收索树,将二叉搜索树转换成排序的双向链表.要求不能创建节点,只能将链表中的指针进行改变. 将复杂的问题简单化:思路:二叉收索树,本身是一个排序结构,中序遍历二叉收索树就可以得到一组排 ...
- 剑指offer-第四章解决面试题思路(复杂链表的复制)
题目:请写一个函数clone(ComplexListNode pHead),实现复杂链表的复制. 复杂链表的数据结构如下:public class ComplexListNode{int m_nVal ...
- 剑指offer-第四章解决面试题思路(判断一个数组是否为二叉搜索树的后序遍历序列)
二叉搜索树:二叉搜索树根节点的左边都比根节点小,右边都比根节点大. 例题:输入一个数组,判断是否为二叉搜索树的后序遍历序列,如果是,返回true,如果不是,返回flase,假设没有重复的元素. 思路: ...
- 剑指Offer:面试题25——二叉树中和为某一值的路径(java实现)
问题描述: 输入一棵二叉树和一个整数,打印出二叉树中结点指的和为输入整数的所有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.二叉树结点的定义如下: public class Tree ...
- 《剑指offer》面试题25 二叉树中和为某一值的路径 Java版
(判断是否有从根到叶子节点的路径,其和为给定值.记录这些路径.) 我的方法:这道题我是按照回溯的思路去做的,我们需要一个数据结构来保存和删除当前递归函数中添加的值.这里要打印一条路径,我们可以选择Li ...
- 【剑指Offer】面试题34. 二叉树中和为某一值的路径
题目 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下二叉树,以及目标和 sum = 22, 5 / ...
- 《剑指offer》面试题34. 二叉树中和为某一值的路径
问题描述 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下二叉树,以及目标和 sum = 22, 5 ...
随机推荐
- Python3:Django连接Mysql数据库时出错,'Did you install mysqlclient or MySQL-python?'
Python3:Django连接Mysql数据库时出错,'Did you install mysqlclient or MySQL-python?' 一.原因 因为Python版本问题,MySQLdb ...
- c刷新缓冲区
int c; while((c = getchar()) != '\n' && c != EOF);
- Spring混合配置
Spring混合配置 一.在JavaConfig中引入其他配置 在JavaConfig中引入JavaConfig配置 使用@Import({OtherConfig1.class,OtherConfig ...
- Oracle常见的几种登录方式
1.运行SQLPLUS工具 C:\Users\csb>sqlplus(回车) (输入账户)system(回车) (输入密码) (回车) 2.直接进入SQLPLUS命令提示符,无用户的登陆 C:\ ...
- JSON和GSON的使用
JSONObject 处理问题 相关博客参考:https://www.cnblogs.com/free-dom/p/5801866.html json-lib 和google gson 的使用 Tor ...
- Spring Boot的核心
1.1.1. 入口类和@SpringBootApplication Spring Boot的项目一般都会有*Application的入口类,入口类中会有main方法,这是一个标准的Java应用程序 ...
- MyBatis使用自定义TypeHandler转换类型
MyBatis虽然有很好的SQL执行性能,但毕竟不是完整的ORM框架,不同的数据库之间SQL执行还是有差异. 笔者最近在升级 Oracle 驱动至 ojdbc 7 ,就发现了处理DATE类型存在问题. ...
- 通过实例深入理解HTML5/CSS3/SVG/WebGL的技术本质
常常听到人们对于HTML5的讨论,看了页面头部这个那个就是Html5,误认为HTML5只是新增些标签“而已”,学完了W3School似乎就理解了.实际上很多从业人员并没有深入理解业界为什么要推出HTM ...
- spring3: 对JDBC的支持 之 Spring提供的其它帮助 SimpleJdbcInsert/SimpleJdbcCall/SqlUpdate/JdbcTemplate 生成主键/批量处理
7.4 Spring提供的其它帮助 7.4.1 SimpleJdbc方式 Spring JDBC抽象框架提供SimpleJdbcInsert和SimpleJdbcCall类,这两个类通过利用JDB ...
- sass基础篇
scss的语法非常简单: $color: red; div{ color: $color; } 这就是一个简单的scss代码. 但是,使用 Sass 进行开发,那么是不是直接通过“<link&g ...