我為樹遍歷撰寫了代碼。在 Binary_tree 類中,我寫了三個方法:__Inorder, __Postorder, 和__Preorder, 用于樹的遍歷;并且我寫了另外三個方法來呼叫它們并self.root作為引數傳入,這樣就不用每次想遍歷的時候都手動傳遞。
代碼:
class Node():
def __init__(self, data):
self.data = data
self.left = None
self.right = None
class Binary_Tree():
def __init__(self):
self.root = None
def insert(self, data):
new_node = Node(data)
if self.root == None:
self.root = new_node
else:
current_node = self.root
while True:
if data > current_node.data:
if not current_node.right:
current_node.right = new_node
return
else:
current_node = current_node.right
else:
if not current_node.left:
current_node.left = new_node
return
else:
current_node = current_node.left
def inorder_traversal(self):
return self.__Inorder(self.root)
def postorder_traversal(self):
return self.__Postorder(self.root)
def preorder_traversal(self):
return self.__Preorder(self.root)
def __Inorder(self, current_node, visited_node = None):
if visited_node is None:
visited_node = []
if current_node:
self.__Inorder(current_node.left, visited_node)
visited_node.append(current_node.data)
self.__Inorder(current_node.right, visited_node)
return visited_node
def __Postorder(self, current_node, visited_node = None):
if visited_node is None:
visited_node = []
if current_node:
self.__Postorder(current_node.left, visited_node)
self.__Postorder(current_node.right, visited_node)
visited_node.append(current_node.data)
return visited_node
def __Preorder(self, current_node, visited_node = None):
if visited_node is None:
visited_node = []
if current_node:
visited_node.append(current_node.data)
self.__Preorder(current_node.left, visited_node)
self.__Preorder(current_node.right, visited_node)
return visited_node
我把這段代碼展示給一個我認識的人,他說“撰寫一個唯一指令是呼叫另一個函式的函式是沒有意義的”,這是糟糕的代碼撰寫。那么,這是真的嗎?如果是,那我該怎么做?
uj5u.com熱心網友回復:
你朋友錯了。
您的函式(如inorder_traversal)不僅僅是呼叫另一個函式:它還不允許呼叫者傳遞任何與其無關的引數(current_node, visited_node)。這使得擁有一個干凈的公共方法是一個很好的決定,而強調的“私有”函式處理反映在其函式引數中的實作細節。
不是您的問題,但我確實看到了避免代碼重復的空間,因為您的基本函式具有非常相似的代碼。您也可以考慮為它們創建生成器而不是填充串列。您還可以考慮將這些私有方法移至Node類。
例如:
class Node():
def __init__(self, data):
self.data = data
self.left = None
self.right = None
def traverse(self, order=0):
if order == -1:
yield self.data
if self.left:
yield from self.left.traverse(order)
if order == 0:
yield self.data
if self.right:
yield from self.right.traverse(order)
if order == 1:
yield self.data
class Binary_Tree():
def __init__(self):
self.root = None
def insert(self, data):
new_node = Node(data)
if self.root == None:
self.root = new_node
else:
current_node = self.root
while True:
if data > current_node.data:
if not current_node.right:
current_node.right = new_node
return
else:
current_node = current_node.right
else:
if not current_node.left:
current_node.left = new_node
return
else:
current_node = current_node.left
def preorder_traversal(self):
if self.root:
return self.root.traverse(-1)
def inorder_traversal(self):
if self.root:
return self.root.traverse(0)
def postorder_traversal(self):
if self.root:
return self.root.traverse(1)
# Demo run
tree = Binary_Tree()
for data in (4,2,3,1,6,5,7):
tree.insert(data)
print(*tree.inorder_traversal())
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/452348.html
