简直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 ...
随机推荐
- APDU指令返回码及其代表含义
9000 正常 成功执行6200 警告 信息未提供6281 警告 回送数据可能出错6282 警告 文件长度小于Le6283 警告 选中的文件无效6284 警告 FCI格式与P2指定的不符6300 警告 ...
- C语言单元测试框架--EmbedUnit
1.简介 Embedded Unit是个纯标准c构建的单元测试框架,主要用在嵌入式c的单体测试上,其主要特点是不依赖于任何C的标准库,所有的对象都是静态分配. 最早这个项目托管在SourceForge ...
- python_初步
官网地址:http://www.python.org/ Python最新源码,二进制文档,新闻资讯 Python文档下载地址:www.python.org/doc/ python教程:http://w ...
- git多站点帐号配置
事件场景 小明同学是一个非常努力的coder,业余时间都花在了github.com上面,因为公司的台式机性能比较好,小明同学想在公司电脑上面也进行开发.但是github上面的帐号邮箱跟公司分配的帐号邮 ...
- Spring_通过注解配置 Bean(2)
- php数组元素去空,测试奇数偶数
<?php//返回奇数 function test_odd($var) { return($var & 1); } $a1=array("a","b&quo ...
- mapreduce&GFS&bigtable learning
之前在学习udf的时候接触到了mapreduce,感觉很酷,于是学习了一下,看了mapreduce和GFS的论文,但是没有总结,只是看了一遍 准备利用在学校的时间,学习一下bigtable,然后再认真 ...
- Ubuntu 16 安装redis客户端
https://snapcraft.io/redis-desktop-manager sudo snap install redis-desktop-manager 很好用! 支持模糊过滤,两边加星号 ...
- NumPy Matplotlib库
NumPy - Matplotlib Matplotlib 是 Python 的绘图库. 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案. 它也可以和图形工具包一起使用,如 ...
- Java多线程 - 线程组
Java使用ThreadGroup来表示线程组,用以对一批线程进行分类管理. Java允许程序对线程组直接进行控制,对线程组的控制相当于同时控制这批线程: 用户创建的所有线程都属于指定线程组,如果程序 ...