Python數據結構之平衡二叉樹

Python數據結構之平衡二叉樹

前言

​   平衡二叉樹(AVL樹):空樹,或者任一結點左、右子樹高度差的絕對值不超過1,也即BF(T)<=1|BF(T)|<=1。而平衡因子(BF),其中hLh_LhRh_R分別爲T的左、右子樹的高度。此外,平衡二叉樹是在BST上建立而成。BF公式如下:
BF(T)=hLhR BF(T) = h_L - h_R

LL型(右旋)

圖示

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-I3ah1PTm-1589339253439)(../Picture/LL型.dio.png)]

代碼

    def right_rotate(node):
        """LL型,右旋"""

        if node is None:
            return
        # 創建新的結點,保存左旋後的結點
        new_node = copy.deepcopy(node)
        new_node.right = node.right
        new_node.left = node.left.right

        # 連接新的左右結點
        node.val = node.left.val
        node.left = node.left.left
        node.right = new_node

結果

LL未平衡: 6 7 8 9 10 12 
LL平衡後: 8 7 6 10 9 12 

RR型(左旋)

圖示

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-6lnVJNeL-1589339253443)(../Picture/RR型.dio.png)]

代碼

    def left_rotate(node):
        """RR型,左旋"""

        if node is None:
            return

        # 創建新的結點,保存左旋後的結點
        new_node = copy.deepcopy(node)
        new_node.left = node.left
        new_node.right = node.right.left

        # 連接新的左右結點
        node.val = node.right.val
        node.right = node.right.right
        node.left = new_node

結果

RR未平衡: 3 4 5 6 7 8 
RR平衡後: 6 4 3 5 7 8 

混合型

圖示

  • LR型

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-wLMyHnU6-1589339253445)(../Picture/LR型.dio.png)]

  • RL型

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-d8voc2C4-1589339253448)(../Picture/RL型.dio.png)]

代碼

    def jude_node(self, node):
        """判斷二叉樹是否平衡"""

        #  1.右子樹高於左子樹,
        if self.get_right_height(node) - self.get_left_height(node) > 1:
            if node.right and self.get_left_height(node.right) > 				                							self.get_right_height(node.right):
                # RL型,右旋後左旋
                self.right_rotate(node.right)
                self.left_rotate(self.root)
            else:
                self.left_rotate(self.root)

            return

        # 2.左子樹高於右子樹
        if self.get_left_height(node) - self.get_right_height(node) > 1:
            if node.left and self.get_right_height(node.left) >                                 						self.get_left_height(node.left):
                
                # LR型,左旋後右旋
                self.left_rotate(node.left)
                self.right_rotate(self.root)
            else:
                self.right_rotate(self.root)

結果

LR未平衡: 6 7 8 9 10 11 
LR平衡後: 8 7 6 10 9 11 
RL未平衡: 7 10 13 14 15 16 17 
RL平衡後: 14 10 7 13 16 15 17 

參考

數據結構與算法–平衡二叉樹/AVL樹 一步一步帶你用Python完整實現平衡二叉樹/AVL樹 Python實現平衡二叉樹/AVL樹的調整 AVL樹結點/節點的調整

中國大學mooc數據結構

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章