二叉树的遍历(递归与非递归)
生活随笔
收集整理的這篇文章主要介紹了
二叉树的遍历(递归与非递归)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
class Node: # 定義樹節點def __init__(self, value, left=None, right=None): # 節點的值及左子樹、右子樹self.value = valueself.left = leftself.right = rightclass Tree: # 定義二叉樹def __init__(self, list):self.list = listself.build_tree()def build_tree(self): # 構建二叉樹,從上到下,從左往右nodelist = [] # 構建節點列表for i in range(len(list)):nodelist.append(Node(list[i])) # 將列表元素添加至節點列表self.root = nodelist[0] # 樹的根節點for i in range(len(list) // 2): # 遍歷節點,構建二叉樹nodelist[i].left = nodelist[i * 2 + 1]if i * 2 + 2 < len(nodelist):nodelist[i].right = nodelist[i * 2 + 2]def recursive_pre_order(self, nodelist, node): # 遞歸前序遍歷,輸出順序:父節點,左子樹,右子樹if node is not None:nodelist.append(node.value)self.recursive_pre_order(nodelist, node.left)self.recursive_pre_order(nodelist, node.right)return nodelistdef recursive_in_order(self, nodelist, node): # 遞歸中序遍歷,輸出順序:左子樹,父節點,右子樹if node is not None:self.recursive_in_order(nodelist, node.left)nodelist.append(node.value)self.recursive_in_order(nodelist, node.right)return nodelistdef recursive_post_order(self, nodelist, node): # 遞歸后序遍歷,輸出順序:左子樹,右子樹,父節點if node is not None:self.recursive_post_order(nodelist, node.left)self.recursive_post_order(nodelist, node.right)nodelist.append(node.value)return nodelist@staticmethoddef not_recursive_pre_order(self, node): # 非遞歸前序遍歷,輸出順序:父節點,左子樹,右子樹if node is not None:stack = [node] # 將根節點壓入棧while len(stack) > 0:print(node.value, end=" ")if node.right is not None: # 根據棧先進后出的特點,將子節點壓棧的時候,先將右子樹壓入棧stack.append(node.right)if node.left is not None: # 將左子樹壓入棧stack.append(node.left)node = stack.pop() # 將棧頂元素彈出@staticmethoddef not_recursive_in_order(self, node): # 非遞歸中序遍歷,輸出順序:左子樹,父節點,右子樹if node is not None:stack = []temp = node # 將根節點復制給中間變量while temp is not None or len(stack) > 0:if temp is not None:stack.append(temp)temp = temp.left # 中序遍歷先遍歷節點的左子樹else:temp = stack.pop() # 將棧頂元素彈出print(temp.value, end=" ") # 輸出棧頂元素的值temp = temp.right # 檢查右子樹@staticmethoddef not_recursive_post_order(self, node): # 非遞歸后序遍歷,輸出順序:左子樹,右子樹,父節點stack1 = [node] # 棧 1 遍歷二叉樹stack2 = [] # 棧 2 存儲輸出順序while len(stack1) > 0:node = stack1.pop()stack2.append(node) # 將父節點壓入棧底if node.left is not None:stack1.append(node.left) # 左子樹壓入棧if node.right is not None:stack1.append(node.right) # 右子樹壓入棧while len(stack2) > 0:print(stack2.pop().value, end=" ") # 輸出順序if __name__ == '__main__':list = [1, 2, 3, 4]tree = Tree(list)print("遞歸前序排列")retList = tree.recursive_pre_order([], tree.root)print(retList)print("非遞歸前序排列")tree.not_recursive_pre_order(tree, tree.root)print("\n遞歸中序排列")retList = tree.recursive_in_order([], tree.root)print(retList)print("非遞歸中序排列")tree.not_recursive_in_order(tree, tree.root)print("\n遞歸后序排列")retList = tree.recursive_post_order([], tree.root)print(retList)print("非遞歸后序排列")tree.not_recursive_post_order(tree, tree.root)
遞歸的方法即不斷調用自身,非遞歸采用入棧出棧完成二叉樹的遍歷
轉載于:https://www.cnblogs.com/soloveu/p/10192579.html
總結
以上是生活随笔為你收集整理的二叉树的遍历(递归与非递归)的全部內容,希望文章能夠幫你解決所遇到的問題。