二叉樹筆記
1.基本概念:
(1)根節點
(2)葉節點
如圖,即爲一個完整的樹模型。
2.樹、圖、鏈表之間的關係
(1)鏈表是特殊化的樹,例如一棵樹只有左子節點,而沒有右子節點;或者一棵樹只有右子節點,而沒有左子節點。如下圖。
(2)樹是特殊的圖,因爲樹是沒有環狀結構,如果樹具有環狀結構,則變成圖。
3.二叉樹,Python定義
class TreeNode:
def__init__(self,val):
self.val = val
self.left,self.right = None,None
4.二叉樹的遍歷(前中後序遍歷)
(1)前序(Pre-order):根——左——右
(2)中序(In-order):左——根——右
(3)後續(Post-order):左——右——根
5.二叉樹遍歷,Python定義
#前序遍歷
def preorder(self,root):
if root:
self.traverse_path.append(root.val)
self.preorder(root.left)
self.preorder(root.right)
#中序遍歷
def inorder(self,root):
if root:
self.inorder(root.left)
self.traverse_path.append(root.val)
self.inorder(root.right)
#後序遍歷
def postorder(self,root):
if root:
self.postorder(root.left)
self.postorder(root.right)
self.traverse_path.append(root.val)
注:樹的操作離不開遞歸,所以千萬不要害怕遞歸,要擁抱遞歸!!
6.二叉搜索樹 Binary Search Tree
二叉搜索樹,也成有序二叉樹(Ordered Binary Tree),排序二叉樹(Sorted Binary Tree),是指一顆孔數或者具有下列性質的二叉樹:
(1)左子樹上所有節點的值均小於它的根節點的值;
(2)右子樹上所有節點的值均大於它的根節點的值;
(3)以此類推,左、右子樹也分別爲二叉查找樹。(這就是重複性!!)
7.二叉查找樹的操作
(1)查找:類似於二分查找
(2)插入:新建子節點
(3)刪除
上述三種操作,最值得說一下的是刪除操作:
①刪除的節點是最末端的葉節點,那麼直接刪除即可,不會對數產生太大的影響。
②刪除的節點下面還有子節點:
此時刪除該節點會對於輸的整體結構產生變化,需要在這個節點下面找到一個節點去代替當前節點,通常情況下是尋找該節點的右子樹下的最小節點代替。
具體事例如下圖,要刪除值爲65 的節點:
8.二叉搜索樹的操作複雜度分析
由上圖可見,二叉搜索樹的操作複雜度一般爲O(log(n)),在最壞的情況下(即退化爲鏈表的情況下),其操作的複雜度將退化爲O(n)。