Python算法和数据结构:在二叉树中找到和为sum的所有路径
玄魂工作室秘书 [玄魂工作室]
思路:先用递归创建一颗二叉树,作为输入;然后对这课二查树进行递归遍历,递归中每遍历一个节点,下次递归的和为sum-data;并用一个数组记录遍历过的路径,当存在sum时,输出数组中的路径。
下图为树的输入,输入的数组为:
[10,5,4,None,3,None,None,7,None,None,12,None,None]
没有子节点的用None表示,构造树时用递归先构造左子树。
代码:
"""
题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
"""
class TreeNode:
"""
树的节点定义,后面的很多操作都是基于节点的
"""
def __init__(self):
"""
定义一个树的节点,初始状态左右节点为空
"""
self.leftNode = None
self.rightNode = None
def setData(self, data):
"""
设置数字的方法
args: data节点值
"""
self.data = data
def setLeftNode(self, leftNode):
"""
设置左节点的方法
args: leftNode 左节点
"""
self.leftNode = leftNode
def setRightNode(self, rightNode):
"""
设置右节点的方法
args: rightNode 右节点
"""
self.rightNode = rightNode
def getData(self):
"""
获取节点数字
return:返回节点数字
"""
return self.data
def getLeftNode(self):
"""
获取左节点
return:返回左节点
"""
return self.leftNode
def getRightNode(self):
"""
获取右节点
return:返回右节点
"""
return self.rightNode
class test:
def __init__(self):
"""
test类的初始化,用来构造树和调用查找算法
return:返回右节点
"""
#self.tree = self.build_tree()
self.index = 0
self.data = [10,5,4,None,3,None,None,7,None,None,12,None,None]
self.tree = self.build_node()
tempNode = self.tree
data_list = []
self.findSum(tempNode, 22, data_list)
def build_node(self):
"""
根据输入,用递归的方法,构造树的方法
"""
if self.index < len(self.data):
curr_data = self.data[self.index]
self.index = self.index + 1
if curr_data != None:
onNode = TreeNode()
onNode.setData(curr_data)
left_node = self.build_node()
onNode.setLeftNode(left_node)
right_node = self.build_node()
onNode.setRightNode(right_node)
return onNode
def findSum(self,node, needsum, data_list):
"""
递归调用findSum,查找和是needsum的路径
args:node是树的根节点,每次递归的是节点移动
needsum是需要求的和
data_list里面存的是路径
"""
if node != None and node.getData() <= needsum :
if node.getData() < needsum:
#print node.getData()
newSum = needsum - node.getData()
curr_data = node.getData()
data_list.append(curr_data)
self.findSum(node.getLeftNode(), newSum, data_list)
self.findSum(node.getRightNode(), newSum, data_list)
data_list.pop()
else:
#开始打印输出路径
if node.getData() == needsum:
for d in data_list:
print d
print node.getData()
print '-----------'
if __name__ == "__main__":
onNode = test()
输出:
10
5
4
3
10
5
7
10
12
欢迎关注订阅号:白话算法
Python算法和数据结构:在二叉树中找到和为sum的所有路径的更多相关文章
- Python算法与数据结构--求所有子数组的和的最大值
Python算法与数据结构--求所有子数组的和的最大值 玄魂工作室-玄魂 玄魂工作室秘书 玄魂工作室 昨天 题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个 ...
- Python实现在给定整数序列中找到和为100的所有数字组合
摘要: 使用Python在给定整数序列中找到和为100的所有数字组合.可以学习贪婪算法及递归技巧. 难度: 初级 问题 给定一个整数序列,要求将这些整数的和尽可能拼成 100. 比如 [17, 1 ...
- python算法与数据结构-常用查找算法一(37)
一.什么是查找 查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录). 查找表(Search Table):由同一类型的数据元素(或记录)构成的集合 ...
- 算法与数据结构(三) 二叉树的遍历及其线索化(Swift版)
前面两篇博客介绍了线性表的顺序存储与链式存储以及对应的操作,并且还聊了栈与队列的相关内容.本篇博客我们就继续聊数据结构的相关东西,并且所涉及的相关Demo依然使用面向对象语言Swift来表示.本篇博客 ...
- 算法与数据结构基础 - 二叉树(Binary Tree)
二叉树基础 满足这样性质的树称为二叉树:空树或节点最多有两个子树,称为左子树.右子树, 左右子树节点同样最多有两个子树. 二叉树是递归定义的,因而常用递归/DFS的思想处理二叉树相关问题,例如Leet ...
- python算法与数据结构-算法介绍(31)
一.算法和数据结构 什么是算法和数据结构?如果将最终写好运行的程序比作战场,我们程序员便是指挥作战的将军,而我们所写的代码便是士兵和武器. 那么数据结构和算法是什么?答曰:兵法!故,数据结构和算法是一 ...
- python算法与数据结构-选择排序算法(33)
一.选择排序的介绍 选择排序(Selection sort)是一种简单直观的排序算法.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素, ...
- [程序员代码面试指南]二叉树问题-在二叉树中找到两个节点的最近公共祖先、[LeetCode]235. 二叉搜索树的最近公共祖先(BST)(非递归)
题目 题解 法一: 按照递归的思维去想: 递归终止条件 递归 返回值 1 如果p.q都不在root为根节点的子树中,返回null 2 如果p.q其中之一在root为根节点的子树中,返回该节点 3 如果 ...
- python算法与数据结构-二叉树的代码实现(46)
一.二叉树回忆 上一篇我们对数据结构中常用的树做了介绍,本篇博客主要以二叉树为例,讲解一下树的数据结构和代码实现.回顾二叉树:二叉树是每个节点最多有两个子树的树结构.通常子树被称作“左子树”(left ...
随机推荐
- KVM内核文档阅读笔记
KVM在内核中有丰富的文档,位置在Documentation/virtual/kvm/. 00-INDEX:整个目录的索引及介绍文档. api.txt:KVM用户空间API,所谓的API主要是通过io ...
- 自动化测试--protractor
前戏 面向模型编程: 测试驱动开发: 先保障交互逻辑,再调整细节.---by 雪狼. 为什么要自动化测试? 1,提高产出质量. 2,减少重构时的痛.反正我最近重构多了,痛苦经历多了. 3,便于新人接手 ...
- 'version' contains an expression but should be a constant
[WARNING] Some problems were encountered while building the effective model for com.app:cache:jar:4. ...
- 唱吧DevOps的落地,微服务CI/CD的范本技术解读
1.业务架构:从单体式到微服务 K歌亭是唱吧的一条新业务线,旨在提供线下便捷的快餐式K歌方式,用户可以在一个电话亭大小的空间里完成K歌体验.K歌亭在客户端有VOD.微信和Web共三个交互入口,业务复杂 ...
- 一个js小游戏----总结
花了大概一天左右的功夫实现了一个js小游戏的基本功能,类似于“雷电”那样的小游戏,实现了随即怪物发生器,碰撞检测,运动等等都实现了,下一个功能是子弹轨迹,还有其他一些扩展功能,没有用库,也没有用web ...
- MVC项目中怎么浏览html页面
public class HomeController : Controller { public ActionResult Index() { //return View(); //return R ...
- C++11中list特有版本的算法
与其他的容器不一样,链表类型的list和forward_list定义了几个成员函数形式的算法,这些函数和前面的所总结的通用算法不同,对于list来说,最好使用自己的特有算法,下面介绍一下主要的几个算法 ...
- [codeforces 901E] Cyclic Cipher 循环卷积-Bluestein's Algorithm
题目大意: 传送门 给两个数列${B_i}.{C_i}$,长度均为$n$,且${B_i}$循环移位线性无关,即不存在一组系数${X_i}$使得对于所有的$k$均有$\sum_{i=0}^{n-1} X ...
- BZOJ_4590_[Shoi2015]自动刷题机_二分答案
BZOJ_4590_[Shoi2015]自动刷题机_二分答案 Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题 ...
- BZOJ_1101_[POI2007]Zap_莫比乌斯反演
题意:FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a ,y<=b,并且gcd(x,y)=d.作为FGD的同学,FGD希望得到 ...