Python演算法和資料結構:在二叉樹中找到和為sum的所有路徑
玄魂工作室祕書 [玄魂工作室]
思路:先用遞迴建立一顆二叉樹,作為輸入;然後對這課二查樹進行遞迴遍歷,遞迴中每遍歷一個節點,下次遞迴的和為sum-data;並用一個陣列記錄遍歷過的路徑,當存在sum時,輸出陣列中的路徑。
下圖為樹的輸入,輸入的陣列為:
[10,5,4,None,3,None,None,7,None,None,12,None,None]
沒有子節點的用None表示,構造樹時用遞迴先構造左子樹。
程式碼:
"""
題目:輸入一個整數和一棵二元樹。
從樹的根結點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑。
列印出和與輸入整數相等的所有路徑。
"""
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
歡迎關注訂閱號:白話演算法
相關文章
- 資料結構和演算法:二叉樹資料結構演算法二叉樹
- 資料結構和演算法-二叉樹,AVL,紅黑樹資料結構演算法二叉樹
- 重學資料結構(六、樹和二叉樹)資料結構二叉樹
- 重學資料結構之樹和二叉樹資料結構二叉樹
- 資料結構和演算法-Go實現二叉搜尋樹資料結構演算法Go
- java資料結構和演算法——平衡二叉樹之左旋轉Java資料結構演算法二叉樹
- 資料結構和演算法面試題系列—二叉樹基礎資料結構演算法面試題二叉樹
- 【資料結構與演算法】二叉樹資料結構演算法二叉樹
- 資料結構(樹):二叉樹資料結構二叉樹
- 重學資料結構和演算法(二)之二叉樹、紅黑樹、遞迴樹、堆排序資料結構演算法二叉樹遞迴排序
- 資料結構——樹和森林資料結構
- 資料結構與演算法:二叉排序樹資料結構演算法排序
- 資料結構筆記——二叉樹的定義和性質資料結構筆記二叉樹
- 資料結構------最短路徑Dijkstra和最小生成樹Prim資料結構
- [Python手撕]二叉樹中的最大路徑和Python二叉樹
- 資料結構 - 二叉樹資料結構二叉樹
- 資料結構-二叉樹資料結構二叉樹
- iOS標準庫中常用資料結構和演算法之二叉排序樹iOS資料結構演算法排序
- 【演算法與資料結構 02】二叉樹的引入演算法資料結構二叉樹
- 二叉樹路徑總和二叉樹
- python演算法與資料結構-演算法和資料結構介紹(31)Python演算法資料結構
- 資料結構與演算法-表示式二叉樹資料結構演算法二叉樹
- 資料結構與演算法-kd二叉樹(kNN)資料結構演算法二叉樹KNN
- 資料結構與演算法-二叉查詢樹資料結構演算法
- 資料結構與演算法-二叉樹性質資料結構演算法二叉樹
- 資料結構與演算法-二叉樹遍歷資料結構演算法二叉樹
- 資料結構和演算法面試題系列—二叉樹面試題彙總資料結構演算法面試題二叉樹
- LeetCode 124. 二叉樹中的最大路徑和 | PythonLeetCode二叉樹Python
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- 資料結構之「二叉樹」資料結構二叉樹
- 資料結構-平衡二叉樹資料結構二叉樹
- 演算法與資料結構——AVL樹(平衡二叉搜尋樹)演算法資料結構
- 資料結構——樹與二叉樹的遍歷資料結構二叉樹
- [資料結構] 樹、二叉樹、森林的轉換資料結構二叉樹
- 資料結構與演算法-kd二叉樹(基礎)資料結構演算法二叉樹
- 【資料結構與演算法】手撕平衡二叉樹資料結構演算法二叉樹
- 【資料結構&演算法】12-線索二叉樹資料結構演算法二叉樹
- 『資料結構與演算法』二叉查詢樹(BST)資料結構演算法