• Python算法和数据结构:在二叉树中找到和为sum的所有路径


    玄魂工作室秘书 [玄魂工作室]

    思路:先用递归创建一颗二叉树,作为输入;然后对这课二查树进行递归遍历,递归中每遍历一个节点,下次递归的和为sum-data;并用一个数组记录遍历过的路径,当存在sum时,输出数组中的路径。

    下图为树的输入,输入的数组为:

    [10,5,4,None,3,None,None,7,None,None,12,None,None]

    没有子节点的用None表示,构造树时用递归先构造左子树。

    image

    代码:

    """
    题目:输入一个整数和一棵二元树。
    
    从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
    
    打印出和与输入整数相等的所有路径。
    
    """
    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


    欢迎关注订阅号:白话算法

    image

  • 相关阅读:
    程序员面试金典--最大和子矩阵
    hihocoder-[Offer收割]编程练习赛25
    牛客网--今日头条2017后端工程师实习生笔试题
    牛客网-网易2017内推笔试编程题合集(二)
    hihocoder-1565-大富翁
    引用传递和值传递
    SSH详解
    Oracle中的游标
    Oracle触发器-变异表触发器不能访问本表
    Oracle中 in、exists、not in,not exists的比较
  • 原文地址:https://www.cnblogs.com/xuanhun/p/9547887.html
Copyright © 2020-2023  润新知