python數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)的統(tǒng)計(jì)與轉(zhuǎn)換實(shí)例
一、獲取二叉樹(shù)的深度
就是二叉樹(shù)最后的層次,如下圖:
實(shí)現(xiàn)代碼:
def getheight(self):
''' 獲取二叉樹(shù)深度 '''
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ì)
葉子就是二叉樹(shù)的節(jié)點(diǎn)的 left 指針和 right 指針?lè)謩e指向空的節(jié)點(diǎn)
def getleafcount(self):
''' 獲取二叉樹(shù)葉子數(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)相對(duì)的其他節(jié)點(diǎn) left 和 right 的指針指向其他節(jié)點(diǎn)
def getbranchcount(self):
''' 獲取二叉樹(shù)分支節(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)
四、二叉樹(shù)左右樹(shù)互換
def replacelem(self):
''' 二叉樹(shù)所有結(jié)點(diǎn)的左右子樹(shù)相互交換 '''
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í)二叉樹(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):
''' 獲取二叉樹(shù)深度 '''
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ù)葉子數(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):
''' 獲取二叉樹(shù)分支節(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):
''' 二叉樹(shù)所有結(jié)點(diǎn)的左右子樹(shù)相互交換 '''
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'''
生成的二叉樹(shù)
------------------------
root
7 8
6
2 5
1 3 4
-------------------------
'''
- Python數(shù)據(jù)結(jié)構(gòu)與算法之字典樹(shù)實(shí)現(xiàn)方法示例
- Python數(shù)據(jù)結(jié)構(gòu)與算法之完全樹(shù)與最小堆實(shí)例
- Python數(shù)據(jù)結(jié)構(gòu)與算法之二叉樹(shù)結(jié)構(gòu)定義與遍歷方法詳解
- python數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)的遍歷實(shí)例
- python數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)的建立實(shí)例
- python數(shù)據(jù)結(jié)構(gòu)樹(shù)和二叉樹(shù)簡(jiǎn)介
- Python數(shù)據(jù)結(jié)構(gòu)樹(shù)與算法分析
相關(guān)文章
使用python框架Scrapy爬取數(shù)據(jù)的操作步驟
Scrapy是一個(gè)基于Python的強(qiáng)大的開(kāi)源網(wǎng)絡(luò)爬蟲(chóng)框架,用于從網(wǎng)站上抓取信息,它提供了廣泛的功能,使得爬取和分析數(shù)據(jù)變得相對(duì)容易,本文小編將給給大家介紹一下如何使用python框架Scrapy爬取數(shù)據(jù),需要的朋友可以參考下2023-10-10用python記錄運(yùn)行pid,并在需要時(shí)kill掉它們的實(shí)例
下面小編就為大家?guī)?lái)一篇用python記錄運(yùn)行pid,并在需要時(shí)kill掉它們的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01python兩個(gè)_多個(gè)字典合并相加的實(shí)例代碼
這篇文章主要介紹了python兩個(gè)_多個(gè)字典合并相加,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12簡(jiǎn)述Python中的進(jìn)程、線程、協(xié)程
這篇文章主要介紹了Python中的進(jìn)程、線程、協(xié)程的相關(guān)資料,需要的朋友可以參考下2016-03-03簡(jiǎn)單有效上手Python3異步asyncio問(wèn)題
這篇文章主要介紹了簡(jiǎn)單有效上手Python3異步asyncio問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01微軟開(kāi)源最強(qiáng)Python自動(dòng)化神器Playwright(不用寫一行代碼)
這篇文章主要介紹了微軟開(kāi)源最強(qiáng)Python自動(dòng)化神器Playwright(不用寫一行代碼),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01