python數(shù)據(jù)結(jié)構(gòu)之二叉樹的統(tǒng)計(jì)與轉(zhuǎn)換實(shí)例
一、獲取二叉樹的深度
就是二叉樹最后的層次,如下圖:

實(shí)現(xiàn)代碼:
def getheight(self):
''' 獲取二叉樹深度 '''
return self.__get_tree_height(self.root)
def __get_tree_height(self, root):
if root is 0:
return 0
if root.left is 0 and root.right is 0:
return 1
else:
left = self.__get_tree_height(root.left)
right = self.__get_tree_height(root.right)
if left < right:
return right + 1
else:
return left + 1
二、葉子的統(tǒng)計(jì)
葉子就是二叉樹的節(jié)點(diǎn)的 left 指針和 right 指針分別指向空的節(jié)點(diǎn)
def getleafcount(self):
''' 獲取二叉樹葉子數(shù) '''
return self.__count_leaf_node(self.root)
def __count_leaf_node(self, root):
res = 0
if root is 0:
return res
if root.left is 0 and root.right is 0:
res += 1
return res
if root.left is not 0:
res += self.__count_leaf_node(root.left)
if root.right is not 0:
res += self.__count_leaf_node(root.right)
return res
三、統(tǒng)計(jì)葉子的分支節(jié)點(diǎn)
與葉子節(jié)點(diǎn)相對的其他節(jié)點(diǎn) left 和 right 的指針指向其他節(jié)點(diǎn)
def getbranchcount(self):
''' 獲取二叉樹分支節(jié)點(diǎn)數(shù) '''
return self.__get_branch_node(self.root)
def __get_branch_node(self, root):
if root is 0:
return 0
if root.left is 0 and root.right is 0:
return 0
else:
return 1 + self.__get_branch_node(root.left) + self.__get_branch_node(root.right)
四、二叉樹左右樹互換
def replacelem(self):
''' 二叉樹所有結(jié)點(diǎn)的左右子樹相互交換 '''
self.__replace_element(self.root)
def __replace_element(self, root):
if root is 0:
return
root.left, root.right = root.right, root.left
self.__replace_element(root.left)
self.__replace_element(root.right)
這些方法和操作,都是運(yùn)用遞歸。其實(shí)二叉樹的定義也是一種遞歸。附上最后的完整代碼:
# -*- coding: utf - 8 - *-
class TreeNode(object):
def __init__(self, left=0, right=0, data=0):
self.left = left
self.right = right
self.data = data
class BinaryTree(object):
def __init__(self, root=0):
self.root = root
def is_empty(self):
if self.root is 0:
return True
else:
return False
def create(self):
temp = input('enter a value:')
if temp is '#':
return 0
treenode = TreeNode(data=temp)
if self.root is 0:
self.root = treenode
treenode.left = self.create()
treenode.right = self.create()
def preorder(self, treenode):
'前序(pre-order,NLR)遍歷'
if treenode is 0:
return
print treenode.data
self.preorder(treenode.left)
self.preorder(treenode.right)
def inorder(self, treenode):
'中序(in-order,LNR'
if treenode is 0:
return
self.inorder(treenode.left)
print treenode.data
self.inorder(treenode.right)
def postorder(self, treenode):
'后序(post-order,LRN)遍歷'
if treenode is 0:
return
self.postorder(treenode.left)
self.postorder(treenode.right)
print treenode.data
def preorders(self, treenode):
'前序(pre-order,NLR)非遞歸遍歷'
stack = []
while treenode or stack:
if treenode is not 0:
print treenode.data
stack.append(treenode)
treenode = treenode.left
else:
treenode = stack.pop()
treenode = treenode.right
def inorders(self, treenode):
'中序(in-order,LNR) 非遞歸遍歷'
stack = []
while treenode or stack:
if treenode:
stack.append(treenode)
treenode = treenode.left
else:
treenode = stack.pop()
print treenode.data
treenode = treenode.right
def postorders(self, treenode):
'后序(post-order,LRN)非遞歸遍歷'
stack = []
pre = 0
while treenode or stack:
if treenode:
stack.append(treenode)
treenode = treenode.left
elif stack[-1].right != pre:
treenode = stack[-1].right
pre = 0
else:
pre = stack.pop()
print pre.data
# def postorders(self, treenode):
# '后序(post-order,LRN)非遞歸遍歷'
# stack = []
# queue = []
# queue.append(treenode)
# while queue:
# treenode = queue.pop()
# if treenode.left:
# queue.append(treenode.left)
# if treenode.right:
# queue.append(treenode.right)
# stack.append(treenode)
# while stack:
# print stack.pop().data
def levelorders(self, treenode):
'層序(post-order,LRN)非遞歸遍歷'
from collections import deque
if not treenode:
return
q = deque([treenode])
while q:
treenode = q.popleft()
print treenode.data
if treenode.left:
q.append(treenode.left)
if treenode.right:
q.append(treenode.right)
def getheight(self):
''' 獲取二叉樹深度 '''
return self.__get_tree_height(self.root)
def __get_tree_height(self, root):
if root is 0:
return 0
if root.left is 0 and root.right is 0:
return 1
else:
left = self.__get_tree_height(root.left)
right = self.__get_tree_height(root.right)
if left < right:
return right + 1
else:
return left + 1
def getleafcount(self):
''' 獲取二叉樹葉子數(shù) '''
return self.__count_leaf_node(self.root)
def __count_leaf_node(self, root):
res = 0
if root is 0:
return res
if root.left is 0 and root.right is 0:
res += 1
return res
if root.left is not 0:
res += self.__count_leaf_node(root.left)
if root.right is not 0:
res += self.__count_leaf_node(root.right)
return res
def getbranchcount(self):
''' 獲取二叉樹分支節(jié)點(diǎn)數(shù) '''
return self.__get_branch_node(self.root)
def __get_branch_node(self, root):
if root is 0:
return 0
if root.left is 0 and root.right is 0:
return 0
else:
return 1 + self.__get_branch_node(root.left) + self.__get_branch_node(root.right)
def replacelem(self):
''' 二叉樹所有結(jié)點(diǎn)的左右子樹相互交換 '''
self.__replace_element(self.root)
def __replace_element(self, root):
if root is 0:
return
root.left, root.right = root.right, root.left
self.__replace_element(root.left)
self.__replace_element(root.right)
node1 = TreeNode(data=1)
node2 = TreeNode(node1, 0, 2)
node3 = TreeNode(data=3)
node4 = TreeNode(data=4)
node5 = TreeNode(node3, node4, 5)
node6 = TreeNode(node2, node5, 6)
node7 = TreeNode(node6, 0, 7)
node8 = TreeNode(data=8)
root = TreeNode(node7, node8, 'root')
bt = BinaryTree(root)
print u'''
生成的二叉樹
------------------------
root
7 8
6
2 5
1 3 4
-------------------------
'''
- Python數(shù)據(jù)結(jié)構(gòu)與算法之字典樹實(shí)現(xiàn)方法示例
- Python數(shù)據(jù)結(jié)構(gòu)與算法之完全樹與最小堆實(shí)例
- Python數(shù)據(jù)結(jié)構(gòu)與算法之二叉樹結(jié)構(gòu)定義與遍歷方法詳解
- python數(shù)據(jù)結(jié)構(gòu)之二叉樹的遍歷實(shí)例
- python數(shù)據(jù)結(jié)構(gòu)之二叉樹的建立實(shí)例
- python數(shù)據(jù)結(jié)構(gòu)樹和二叉樹簡介
- Python數(shù)據(jù)結(jié)構(gòu)樹與算法分析
相關(guān)文章
利用Python實(shí)現(xiàn)自動生成圖文并茂的數(shù)據(jù)分析
這篇文章主要介紹了利用Python實(shí)現(xiàn)自動生成圖文并茂的數(shù)據(jù)分析,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08
一文詳解凱撒密碼的原理及Python實(shí)現(xiàn)
凱撒密碼是古羅馬愷撒大帝用來對軍事情報(bào)進(jìn)行加密的算法,它采用了替換方法對信息中的每一個英文字符循環(huán)替換為字母表序列該字符后面第三個字符。本文主要為大家講解了凱撒密碼的原理及實(shí)現(xiàn),需要的可以參考一下2022-08-08
Python3.5.3下配置opencv3.2.0的操作方法
下面小編就為大家分享一篇Python3.5.3下配置opencv3.2.0的操作方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
Python實(shí)現(xiàn)base64編碼的圖片保存到本地功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)base64編碼的圖片保存到本地功能,涉及Python針對base64編碼解碼與圖形文件輸出保存相關(guān)操作技巧,需要的朋友可以參考下2018-06-06
Django項(xiàng)目之Elasticsearch搜索引擎的實(shí)例
今天小編就為大家分享一篇Django項(xiàng)目之Elasticsearch搜索引擎的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
python使用typing模塊加強(qiáng)代碼的可讀性(實(shí)戰(zhàn)演示)
Python是一門弱類型的語言,很多時(shí)候我們可能不清楚函數(shù)參數(shù)類型或者返回值類型,很有可能導(dǎo)致一些類型沒有指定方法,typing模塊可以很好的解決這個問題。下面通過本文給大家介紹python使用typing模塊加強(qiáng)代碼的可讀性,感興趣的朋友一起看看吧2021-12-12
python 實(shí)現(xiàn)一次性在文件中寫入多行的方法
今天小編就為大家分享一篇python 實(shí)現(xiàn)一次性在文件中寫入多行的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01

