Python算法和數據結構:在二叉樹中找到和爲sum的全部路徑

玄魂工做室祕書 [玄魂工做室]node

思路:先用遞歸建立一顆二叉樹,做爲輸入;而後對這課二查樹進行遞歸遍歷,遞歸中每遍歷一個節點,下次遞歸的和爲sum-data;並用一個數組記錄遍歷過的路徑,當存在sum時,輸出數組中的路徑。python

下圖爲樹的輸入,輸入的數組爲:算法

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

沒有子節點的用None表示,構造樹時用遞歸先構造左子樹。app

image

代碼:ui

"""
題目:輸入一個整數和一棵二元樹。

從樹的根結點開始往下訪問一直到葉結點所通過的全部結點造成一條路徑。

打印出和與輸入整數相等的全部路徑。

"""
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()

輸出:
10code

5blog

4遞歸

3get


10

5

7


10

12


歡迎關注訂閱號:白話算法

image

相關文章
相關標籤/搜索