博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
4在二元树中找出和为某一值的所有路径
阅读量:5926 次
发布时间:2019-06-19

本文共 3557 字,大约阅读时间需要 11 分钟。

转载请注明出处:

声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,故原出处已不好查到,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明。谢谢。 

题目:输入一个整数和一棵二叉树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。

  例如 输入整数22和如下二叉树
   10 
   / \  
   5 12  
   /   \  
  4     7
  则打印出两条路径:10, 12和10, 5, 7。
  
设计思路:
  1. 输入一个整形数组和一个整数,根据数组创建二叉树
  2.用一个将当前路径的节点列表path 和总路径列表pathlist分别保存到LinkedList里,用一个变量(currentSum)保存当前节点值之和
    a).若树为空,则结束查找。
    b).将当前节点的值累加到currentSum,将当前节点累加到path。
    c).若当前节点已经是叶子节点并且currentSum等于你的期望值,则将path累加到pathlist。
    d).如果当前节点不为叶子结点,则递归查找它的左右孩子结点。
    e).将当前结点从当前路径里删除,currentSum返回累加之前的值  ,及恢复到当前节点的父节点状态。
 
注:我创建的是一颗二叉排序树,若想创建其他类型的树则可将创建树的过程稍作修改。
java 实现代码如下:
 
1 package com.interview;  2   3 import java.util.LinkedList;  4   5 /**  6  * 在二元树中找出和为某一值的所有路径  7  * 注:此处建立的是一颗排序二叉树  8  * @author wjh  9  * 10  */ 11  12 public class _4SearchPath { 13  14     /** 15      * @param args 16      */ 17     public _4SearchPath() { 18         super(); 19         // TODO Auto-generated constructor stub 20     } 21  22     public static void main(String[] args) { 23         int[] first = {10,5,12,4,7}; 24         LinkedList
path = new LinkedList
(); //保存路径 25 LinkedList
> pathlist = new LinkedList
>(); //保存路径列表 26 Node root = null; 27 root = createTree( root, first); //1)建树 28 searchPath(root, 22, 0, path,pathlist);//2)查找路径 29 System.out.println("这是所有的路径:"); 30 printPath(pathlist); //3)打印路径 31 } 32 33 //在二元树中找出和为某一值的所有路径 34 private static void searchPath(Node root, int yourSum, int currentSum, LinkedList
path, 35 LinkedList
> pathlist){ 36 if( root==null ) 37 return; 38 currentSum += root.data; //将当前结点值累加至当前和变量中 39 path.add(root); //结点加入到路径里 40 /** 41 * 如果当前的结点为叶子结点,且和为你输入的值,则将路径 加入到李静列表里 42 * 若无需保存路径列表,在在此直接打印path,不用添加到pathlist里 43 */ 44 if(root.left==null && root.right==null && currentSum == yourSum){ 45 LinkedList
temppath = new LinkedList
(); 46 for(Node node: path){ 47 temppath.add(node); 48 } 49 pathlist.add(temppath); //没有直接add(path) 是因为path在之后的过程中会被改变 50 } 51 /**如果当前节点不为叶子结点,则递归查找它的左右孩子结点*/ 52 if(root.left!=null) 53 searchPath(root.left, yourSum, currentSum, path, pathlist); 54 if(root.right!=null) 55 searchPath(root.right, yourSum, currentSum, path, pathlist); 56 /**当前结点从当前路径里删除,currentSum返回累加之前的值 ,及恢复到当前节点的父节点状态*/ 57 currentSum -= root.data; 58 path.removeLast(); 59 } 60 61 //打印所有路径 62 private static void printPath(LinkedList
> pathlist){ 63 for(LinkedList
path: pathlist){ 64 int n = path.size(); 65 for(int i=0;i
"); 68 else 69 System.out.print(path.get(i).data); 70 } 71 System.out.println(); 72 } 73 } 74 75 //创建二叉排序树 76 public static Node createTree(Node root, int[] r){ 77 int n = r.length; 78 System.out.println("建树过程(a<--b表示在a左边插入b;a-->b表示在a右边插入b):"); 79 for(int i=0;i
child.data){ 95 System.out.print(root.data+"<--");//在root左边插入 96 root.left = insert(root.left, child); 97 } 98 else{ 99 System.out.print(root.data+"-->"); //在root右边插入100 root.right = insert(root.right,child);101 } 102 return root;103 }104 105 //节点的数据结构106 private static class Node {107 public int data;108 public Node left; //指向左子树109 public Node right; //指向右子树110 public Node() {111 super();112 // TODO Auto-generated constructor stub113 }114 public Node(int data, Node left, Node right) {115 super();116 this.data = data;117 this.left = left;118 this.right = right;119 }120 }121 122 }

 

运行结果:

 建树过程(a<--b表示在a左边插入b;a-->b表示在a右边插入b):
10
10<--5
10-->12
10<--5<--4
10<--5-->7
这是所有的路径:
10-->5-->7
10-->12
 
 

转载于:https://www.cnblogs.com/wuzetiandaren/p/4249910.html

你可能感兴趣的文章
apache prefork模式优化错误
查看>>
jmeter高级用法例子,如何扩展自定义函数
查看>>
lvs
查看>>
通过jsp请求Servlet来操作HBASE
查看>>
JS页面刷新保持数据不丢失
查看>>
清橙A1202&Bzoj2201:彩色圆环
查看>>
使用data pump工具的准备
查看>>
springMVC---级联属性
查看>>
get和post区别
查看>>
项目总结26:java调用webservice接口(asmx)
查看>>
crontab执行shell脚本日志中出现乱码
查看>>
打造自己博客(wordpress)的wap手机版本
查看>>
Floodlight 在 ChannelPipeline 图
查看>>
leetcode-Word Ladder II
查看>>
VS2017调试闪退之Chrome
查看>>
做移动互联网App,你的测试用例足够吗?
查看>>
cmd.exe启动参数说明
查看>>
私活利器,docker快速部署node.js应用
查看>>
《随笔记录》20170310
查看>>
网站分析系统
查看>>