剑指offer:二叉树中和为某一值的路径
本来这只是一个普通的算法题,但是当初自己OJ上提交时,总是提交失败,而我自己认定程序逻辑没有任何问题。然后开始就在本机上调试,结果发现这是由于Python的对象机制而引发的。所以先把问题算法题贴出来,然后通过该问题,详述Python的对象机制!
题目描述:
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
这道题本身不难,书上、网上也有很多关于该问题的解释,这里我就直接贴上我的Python代码(该代码有一处很隐晦的bug)。
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回二维列表,内部每个列表表示找到的路径
def FindPath(self, root, expectNumber):
# write code here
if not root:
return [] ret = [] # 函数返回的二维列表
path = [] # 遍历过程中经历的路径,假如符合条件,就加入到ret列表中
self.Find(root, target, ret, path)
return ret def Find(self, root, target, ret, path):
if not root:
return path.append(root.val)
isLeaf = root.left is None and root.right is None
if isLeaf and target == root.val:
ret.append(path) # 对于叶子节点,加上符合条件的path. if root.left:
Find(root.left, target - root.val, ret, path)
if root.right:
Find(root.left, target - root.val, ret, path) path.pop()
算法程序逻辑没有任何问题,却总是通不过OJ。一遍遍审查后,实在找不出哪里的错误,然后尝试调试。


看到了吗?程序运行过程中,已经正确的把路径保存下来了。但是,最终程序返回的结果是包含两个[]的列表。
如此,突然感觉豁然开朗了,于是,把第27行换成 ret.append(path[:])
下面是改正后代码,成功通过OJ系统
# -*- coding:utf-8 -*-
class Solution:
# 返回二维列表,内部每个列表表示找到的路径
def FindPath(self, root, expectNumber):
# write code here
if not root:
return [] ret = []
path = []
self.Find(root, expectNumber, ret, path)
# print ret
# a = [];self.f(a);print a
return ret def Find(self, root, target, ret, path):
if not root:
return path.append(root.val)
isLeaf = (root.left is None and root.right is None)
if isLeaf and target == root.val:
ret.append(path[:]) # 这里这一步要千万注意啊,
# 假如是:ret.append(path), 结果是错的。因为Python可变对象都是引用传递啊。 #print "target:", target, "isLeaf:", isLeaf,
#print "val:", root.val, "path:", path, "ret:", ret
#print if root.left:
self.Find(root.left, target - root.val, ret, path)
if root.right:
self.Find(root.right, target - root.val, ret, path) path.pop()

至于为什么这小小的差别,会导致程序完全不同的运行行为,则涉及到Python的可变对象、不可变对象等机制。下一节,会对该问题进行详述!
剑指offer:二叉树中和为某一值的路径的更多相关文章
- 剑指offer 二叉树中和为某一个值的路径
剑指offer 牛客网 二叉树中和为某一个值的路径 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 15:53:58 2 ...
- 剑指Offer 二叉树中和为某一值的路径(dfs)
题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 思路: 递归,然后深搜,因为题目定义的, ...
- 剑指Offer——二叉树中和为某一值的路径
题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 分析: 先序遍历二叉树,找到二叉树中结点值的和 ...
- 用java刷剑指offer(二叉树中和为某一值的路径)
题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大 ...
- 用js刷剑指offer(二叉树中和为某一值的路径)
题目描述 输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大 ...
- 剑指offer--31.二叉树中和为某一值的路径
深度优先搜索 --------------------------------------------------------------------------------------------- ...
- 剑指Offer-24.二叉树中和为某一值的路径(C++/Java)
题目: 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大的 ...
- 剑指offer-二叉树中和为某一值的路径
题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 解题思路 利用前序遍历的思想,定义FindP ...
- 剑指offer-二叉树中和为某一值的路径24
题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大 ...
- 剑指offer-二叉树中和为某一值的路径-python
题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大 ...
随机推荐
- SQL SERVER利用BCP命令在命令行下导出数据到csv文件中
bcp "select * from (DBNAME).dbo.qt_trace where User_1 is not null" queryout c:\%date:~6,4% ...
- 什么是Docker?
概观 Docker是推动集装箱运动的公司,也是唯一一家能够解决混合云中的每个应用的集装箱平台提供商.当今的企业面临数字化转型的压力,但受到现有应用程序和基础架构的制约,同时合理化日益多样化的云,数 ...
- 【PAT】B1061 判断题(15 分)
简单逻辑题, #include<stdio.h> #include<algorithm> using namespace std; int main(){ int N,M;// ...
- Nginx服务器的图片防盗链
全站的防盗链方法 在/usr/local/webserver/nginx/conf//vhost/xxxx.conf文件要添加防盗链的server段里添加下面的代码: location ~ .*\.( ...
- 【九校3D2T3】世界第一的猛汉王
[问题描述] 卡普地公司举办了「世界第一的猛汉王」全球大会,来自世界各地的猛汉为了争夺「猛汉王」的名号前来一决高下.现在举行的是弓箭组选拔赛.卡普地公司为比赛新建了一张PVP地图——「猛汉竞技场」.有 ...
- Scala 上下文界定
上下文界定的类型参数形式为T:M的形式,其中M是一个泛型,这种形式要求存在一个M[T]类型的隐式值: /** * 上下文界定 */ @Test def testOrdering_Class_Conte ...
- wallet.metamask.io 网页版钱包 connecting unknown network导致页面卡住
之前在还不是十分懂用的时候想要用其连接本地的打开的ganache,所以就像使用本地插件的metamask一样,点击custom rpc,然后输入http://localhost:7545,然后页面就一 ...
- Jenkins忘记密码解决方案
# 当jenkins忘记了管理用户的密码时,只能通过修改配置文件并重启的方式初始化设置用户名及密码,操作如下: 找到jenkins的配置目录,笔者的jenkins是下载的war包直接丢在tomcat下 ...
- Qt5中的lambda表达式和使用lambda来写connect
c11新特性中加入了lambda表达式,所以Qt 也支持 需在.pro文件中加入 CONFIG += c++11 例子: QString program = "C:/Windows/Syst ...
- gitlab备份及恢复
gitlab备份步骤 https://blog.csdn.net/qq_31666147/article/details/79844107 gitlab版本 下载地址 https://mirrors ...