NO_4在二元树中找出和为某一值的所有路径

题目博客:

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值