python二叉樹常用算法總結(jié)
1.1 二叉樹的初始化
#initial of BinaryTree class BinaryTree: def __init__(self,rootObj): self.val = rootObj self.left = None self.right = None def insertLeft(self,newNode): if self.left == None: self.left = BinaryTree(newNode) else: t = BinaryTree(newNode) t.left = self.left self.left = t def insertRight(self,newNode): if self.right == None: self.right = BinaryTree(newNode) else: t = BinaryTree(newNode) t.right = self.right self.right = t
1.2 創(chuàng)建一個(gè)二叉樹
#create a BinaryTree [18,7,11,3,4,5,6,#,#,#,#,1,3,2,4] # 18 # 7 11 #3 4 5 6 # 1 3 2 4 root = BinaryTree(18) root.left = BinaryTree(7) root.right = BinaryTree(11) root.left.left = BinaryTree(3) root.left.right = BinaryTree(4) root.right.left = BinaryTree(5) root.right.right = BinaryTree(6) root.right.left.left = BinaryTree(1) root.right.left.right = BinaryTree(3) root.right.right.left = BinaryTree(2) root.right.right.right = BinaryTree(4)
1.3 前序遍歷
#遞歸版本 def PreOrder(self, node): if node: print(node.val) self.PreOrder(node.left) self.PreOrder(node.right) #循環(huán)版本 def PreOrderLoop(self, node): if node == None: return stack =[] print(node.val) stack.append(node) node = node.left while stack!=[] or node: while node: print(node.val) stack.append(node) node = node.left node = stack[-1].right stack.pop() #ouput: 18 7 3 4 11 5 1 3 6 2 4
1.4 中序遍歷
#遞歸版本 def InOrder(self, node): if node: self.InOrder(node.left) print(node.val) self.InOrder(node.right) #循環(huán)版本 def InOrderLoop(self, node): if node == None: return None stack = [] stack.append(node) node = node.left while stack!=[] or node: while node: stack.append(node) node = node.left print(stack[-1].val) node = stack[-1].right stack.pop() #output:3 7 4 18 1 5 3 11 2 6 4
1.5 后序遍歷
#遞歸 def PostOrder(self, node): if node: self.PostOrder(node.left) self.PostOrder(node.right) print(node.val) #非遞歸 def PostOrderLoop(self, node): if node == None: return stack =[] stack.append(node) pre = None while stack!=[]: node = stack[-1] if ((node.left==None and node.right==None) or (pre and (pre == node.left or pre ==node.right))): print(node.val) pre = node stack.pop() else: if node.right: stack.append(node.right) if node.left: stack.append(node.left) #output:3 4 7 1 3 5 2 4 6 11 18
1.6 層序遍歷
def LevelOrder(self, node): if node == None: return stack = [] stack.append(node) while stack!=[]: node = stack[0] if node.left: stack.append(node.left) if node.right: stack.append(node.right) print(node.val) stack.pop(0) output: 18 7 11 3 4 5 6 1 3 2 4
1.7 計(jì)算節(jié)點(diǎn)數(shù)
#遞歸版本 def CountNode(self, root): if root == None: return 0 return self.CountNode(root.left) + self.CountNode(root.right) + 1 #非遞歸版本 def CountNodeNotRev(self, root): if root == None: return 0 stack = [] stack.append(root) index = 0 while index<len(stack): if stack[index].left: stack.append(stack[index].left) if stack[index].right: stack.append(stack[index].right) index += 1 print(len(stack)) output: 11
1.8 計(jì)算樹的深度
def getTreeDepth(self, root): if root == None: return 0 left = self.getTreeDepth(root.left) + 1 right = self.getTreeDepth(root.right) + 1 return left if left>right else right
1.9 計(jì)算樹的葉子樹
def countLeaves(self, root): if root == None: return 0 if root.left==None and root.right==None: return 1 return self.countLeaves(root.left)+self.countLeaves(root.right)
1.10 獲取第K層節(jié)點(diǎn)數(shù)
def getKLevel(self, root, K): if root == None: return 0 if K == 1: return 1 return self.getKLevel(root.left, K-1)+self.getKLevel(root.right, K-1)
1.11 判斷兩顆二叉樹是否相同
def StrucCmp(self, root1, root2): if root1 == None and root2 == None: return True elif root1 ==None or root2 == None: return False return self.StrucCmp(root1.left, root2.left) and self.StrucCmp(root1.right, root2.right)
1.12 二叉樹的鏡像
def Mirror(self, root): if root == None: return tmp = root.left root.left = root.right root.right = tmp self.Mirror(root.left) self.Mirror(root.right)
1.13 找最低公共祖先節(jié)點(diǎn)
def findLCA(self, root, node1, node2): if root == None: return if root == node1 or root == node2: return root left = self.findLCA(root.left, node1, node2) right = self.findLCA(root.right, node1, node2) if left and right: return root return left if left else right
1.14 獲取兩個(gè)節(jié)點(diǎn)的距離
def getDist(self, root, node1, node2): lca = self.findLCA(root, node1, node2) #找最低公共祖宗節(jié)點(diǎn) level1 = self.FindLevel(lca, node1) #祖節(jié)點(diǎn)到兩個(gè)節(jié)點(diǎn)的距離 level2 = self.FindLevel(lca, node2) return level1+level2 def FindLevel(self, node, target): if node == None: return -1 if node == target: return 0 level = self.FindLevel(node.left, target) if level == -1: level = self.FindLevel(node.right, target) if level != -1: return level + 1 return -1
1.15 找一個(gè)節(jié)點(diǎn)的所有祖宗節(jié)點(diǎn)
def findAllAncestor(self, root, target): if root == None: return False if root == target: return True if self.findAllAncestor(root.left, target) or self.findAllAncestor(root.right, target): print(root.val) return True return False
到此這篇關(guān)于python
二叉樹常用算法總結(jié)的文章就介紹到這了,更多相關(guān)python二叉樹常用算法,內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
對(duì)python中兩種列表元素去重函數(shù)性能的比較方法
今天小編就為大家分享一篇對(duì)python中兩種列表元素去重函數(shù)性能的比較方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06python使用PIL把透明背景圖片轉(zhuǎn)成白色背景的示例代碼
當(dāng)我們?cè)诓杉恍﹫D片的時(shí)候,這些圖片的背景經(jīng)常是透明的,但是如何把透明背景轉(zhuǎn)成白色背景呢,接下來就給大家解決這個(gè)問題,本文主要介紹了python使用PIL把透明背景圖片轉(zhuǎn)成白色背景,需要的朋友可以參考下2023-08-08pytorch中torch.max和Tensor.view函數(shù)用法詳解
今天小編就為大家分享一篇pytorch中torch.max和Tensor.view函數(shù)用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01django將圖片保存到mysql數(shù)據(jù)庫(kù)并展示在前端頁面的實(shí)現(xiàn)
這篇文章主要介紹了django將圖片保存到mysql數(shù)據(jù)庫(kù)并展示在前端頁面的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05PyTorch 中的傅里葉卷積實(shí)現(xiàn)示例
這篇文章主要介紹了PyTorch 中的傅里葉卷積實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Python 中的參數(shù)傳遞、返回值、淺拷貝、深拷貝
這篇文章主要介紹了Python 中的參數(shù)傳遞、返回值、淺拷貝、深拷貝,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06安裝python時(shí)MySQLdb報(bào)錯(cuò)的問題描述及解決方法
這篇文章主要介紹了安裝python時(shí)MySQLdb報(bào)錯(cuò)的問題描述及解決方法,需要的朋友可以參考下2018-03-03Python寫一個(gè)字符串?dāng)?shù)字后綴部分的遞增函數(shù)
這篇文章主要介紹了Python寫一個(gè)字符串?dāng)?shù)字后綴部分的遞增函數(shù),寫函數(shù)之前需要Python處理重名字符串,添加或遞增數(shù)字字符串后綴,下面具體過程,需要的小伙伴可以參考一下2022-03-03