日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

二叉树的遍历(递归与非递归)

發布時間:2023/11/27 生活经验 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二叉树的遍历(递归与非递归) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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

總結

以上是生活随笔為你收集整理的二叉树的遍历(递归与非递归)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。