玄魂工做室祕書 [玄魂工做室]node
思路:先用遞歸建立一顆二叉樹,做爲輸入;而後對這課二查樹進行遞歸遍歷,遞歸中每遍歷一個節點,下次遞歸的和爲sum-data;並用一個數組記錄遍歷過的路徑,當存在sum時,輸出數組中的路徑。python
下圖爲樹的輸入,輸入的數組爲:算法
[10,5,4,None,3,None,None,7,None,None,12,None,None]數組
沒有子節點的用None表示,構造樹時用遞歸先構造左子樹。app
代碼: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
歡迎關注訂閱號:白話算法