1.定義:樹(tree)是n(n≥0)個節點的有限集合t,它滿足兩個條件:有且僅有乙個特定的稱為根(root)的節點;其餘的節點可以分為m(m≥0)個互不相交的有限集合t1、t2、……、tm,其中每乙個集合又是一棵樹,並稱為其根的子樹(subtree)。
2.基本概念
定義與特徵
1.定義:二叉樹(binary tree)是n(n≥0)個節點的有限集合,它或者是空集(n=0),或者是由乙個根節點以及兩棵互不相交的、分別稱為左子樹和右子樹的二叉樹組成。二叉樹與普通有序樹不同,二叉樹嚴格區分左孩子和右孩子,即使只有乙個子節點也要區分左右。
2.二叉樹的特徵
二叉樹的遍歷
遍歷 :沿某條搜尋路徑周遊二叉樹,對樹中的每乙個節點訪問一次且僅訪問一次。
先序遍歷: 先訪問樹根,再訪問左子樹,最後訪問右子樹;
中序遍歷: 先訪問左子樹,再訪問樹根,最後訪問右子樹;
後序遍歷: 先訪問左子樹,再訪問右子樹,最後訪問樹根;
層次遍歷: 從根節點開始,逐層從左向右進行遍歷。
遞迴思想和實踐
1.什麼是遞迴?
所謂遞迴函式是指乙個函式的函式體中直接呼叫或間接呼叫了該函式自身的函式。這裡的直接呼叫是指乙個函式的函式體中含有呼叫自身的語句,間接呼叫是指乙個函式在函式體裡有呼叫了其它函式,而其它函式又反過來呼叫了該函式的情況。
2.遞迴函式呼叫的執行過程分為兩個階段
遞推階段:從原問題出發,按遞迴公式遞推從未知到已知,最終達到遞迴終止條件。
回歸階段:按遞迴終止條件求出結果,逆向逐步代入遞迴公式,回歸到原問題求解。
3.優點與缺點
優點:遞迴可以把問題簡單化,讓思路更為清晰,**更簡潔
缺點:遞迴因系統環境影響大,當遞迴深度太大時,可能會得到不可預知的結果
# 求n的階乘def recursion(n):
# 遞迴終止條件
二叉樹的**實現
二叉樹順序儲存
二叉樹本身是一種遞迴結構,可以使用python list 進行儲存。但是如果二叉樹的結構比較稀疏的話浪費的空間是比較多的。
#鏈式儲存
class treenode:
def __init__(self,data = none,left = none,right = none):
self.data = data
self.right = right
self.left = left
class bitree:
def __init__(self,root = none):
self.root = root
def preorder(self,node):
if node is none:
return
print(node.data,end = " ")
self.preorder(node.left)
self.preorder(node.right)
def inorder(self,node):
if node is none:
return
self.inorder(node.left)
print(node.data,end = " ")
self.inorder(node.right)
def postorder(self,node):
if node is none:
return
self.postorder(node.left)
self.postorder(node.right)
print(node.data,end = " ")
python資料結構 3 二叉樹
基本概念 空樹 不包含任何節點的樹是 單點樹 只包含乙個節點的樹是 滿二叉樹 如果二叉樹中所有分支節點的度數都為2,則為 完全二叉樹 除了最後一層節點全都填滿,並且最後一層空位在右邊 擴充二叉樹 遍歷二叉樹 先根序 中根序 後根序 先根序列 後根序列 對稱序列 層次序列 寬度優先遍歷 theory1...
資料結構 二叉樹 2 平衡二叉樹 3
前面分析了平衡二叉樹是怎麼調整平衡的,這裡就來解決另乙個問題,平衡二叉樹理論為什麼能成立?難道就不會有怎麼調都不會平衡的情況嗎?一起 一下吧。我在很早的時候就注意到了乙個問題。上圖中是一顆不平衡的二叉樹向平衡調整的一部分過程,這個過程中我發現,子樹a,b,c,d的左右關係始終都是不變的,就是從左到右...
資料結構 樹,二叉樹
樹 1 樹是n n 0 個有限個資料的元素集合,形狀像一顆倒過來的樹。2 節點 結點包含資料和指向其它節點的指標。3 根節點 樹第乙個結點稱為根節點。4 結點的度 結點擁有的子節點個數。5 葉節點 沒有子節點的節點 度為0 6 父子節點 乙個節點father指向另乙個節點child,則child為孩...