题目博客:
http://blog.youkuaiyun.com/v_JULY_v/article/details/6057286
题目:
输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数22和如下二元树
10
/ /
5 12
/ \
4 7
则打印出两条路径:10, 12和10, 5, 7。
二元树节点的数据结构定义为:
struct BinaryTreeNode // a node in the binary tree
{
int m_nValue; // value of node
BinaryTreeNode *m_pLeft; // left child of node
BinaryTreeNode *m_pRight; // right child of node
};
__author__ = 'Administrator'
import copy
class TreeNode:
def __init__(self,value,leftChild=None,rightChild=None):
self.value=value
self.leftChild,self.rightChild=leftChild,rightChild
def print_load(root,value=22):
ps=print_loadwithold([[]],root,22)
for innerpath in ps:
for inner_obj in innerpath:
print inner_obj.value,
print
def print_loadwithold(oldpath,curnode,leftvalue):
if leftvalue<0:
return None
else:
if not curnode:
return None
for innerpath in oldpath:
innerpath.append(curnode)
if curnode.value==leftvalue:
return oldpath
leftpath=print_loadwithold(copy.deepcopy(oldpath),curnode.leftChild,leftvalue-curnode.value)
rightpath=print_loadwithold(copy.deepcopy(oldpath),curnode.rightChild,leftvalue-curnode.value)
finalpath=[]
for path in (leftpath,rightpath):
if path:
finalpath.extend(path)
return finalpath
node4=TreeNode(4)
node7=TreeNode(7)
node5=TreeNode(5,node4,node7)
node12=TreeNode(12)
node10=TreeNode(10,leftChild=node5,rightChild=node12)
print_load(node10)
import copy
class TreeNode:
def __init__(self,value,leftChild=None,rightChild=None):
self.value=value
self.leftChild,self.rightChild=leftChild,rightChild
def print_load(root,value=22):
ps=print_loadwithold([[]],root,22)
for innerpath in ps:
for inner_obj in innerpath:
print inner_obj.value,
print
def print_loadwithold(oldpath,curnode,leftvalue):
if leftvalue<0:
return None
else:
if not curnode:
return None
for innerpath in oldpath:
innerpath.append(curnode)
if curnode.value==leftvalue:
return oldpath
leftpath=print_loadwithold(copy.deepcopy(oldpath),curnode.leftChild,leftvalue-curnode.value)
rightpath=print_loadwithold(copy.deepcopy(oldpath),curnode.rightChild,leftvalue-curnode.value)
finalpath=[]
for path in (leftpath,rightpath):
if path:
finalpath.extend(path)
return finalpath
node4=TreeNode(4)
node7=TreeNode(7)
node5=TreeNode(5,node4,node7)
node12=TreeNode(12)
node10=TreeNode(10,leftChild=node5,rightChild=node12)
print_load(node10)
使用字典存路径:
def GetLoad(curnode,pre_dic,value=22,prenode=None):
if not curnode:
return None
else:
if prenode:
pre_dic[curnode.value]=prenode.value
else:
pre_dict[curnode.value]=-1
if curnode.value==value:
return [curnode.value]
elif curnode.value>value:
return None
else:
finallist=[]
for nodelist in (GetLoad(curnode.leftChild,pre_dic,value-curnode.value,curnode),
GetLoad(curnode.rightChild,pre_dic,value-curnode.value,curnode)):
if nodelist:
finallist.extend(nodelist)
return finallist
return None