亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

python 平衡二叉樹實現代碼示例

2020-02-15 22:14:05
字體:
來源:轉載
供稿:網友

平衡二叉樹:

在上一節二叉樹的基礎上我們實現,如何將生成平衡的二叉樹

所謂平衡二叉樹:

我自己定義就是:任何一個節點的左高度和右高度的差的絕對值都小于2

如圖所示,此時a的左高度等于3,有高度等于1,差值為2,屬于不平衡中的左偏

  

此時的處理辦法就是:

將不平衡的元素的左枝的最右節點變為當前節點,

此時分兩種情況:

一、左枝有最右節點

將最右節點的左枝賦予其父節點的右枝

二、左枝沒有最右節點,

直接將左枝節點做父級節點,父級節點做其右枝

      

如圖所示,圖更清楚些。

可能會有疑問,為什么這樣變換?

假定a左偏,就需要一個比a小的最少一個值d(因為d唯一 一個是比a小,而且比a的左枝所有數都大的值)做父集結點,a做d的右枝,這樣在最上面的d節點就平衡了。

我們可以反證一下:

如果不是d是另一個數假設為h,此時h做父節點,a做父節點的右節點

因為a在h右邊,所以 a > h

因為b,e,d,f都是h的左枝,所以 h>d>b>e>f

所以 a>h>d>b>e>f

所以在不加入新節點的情況下,就只能是d    

左偏和右偏是一樣的,可以完全鏡像過來就ok了

處理了所有節點 的左偏和右偏使整個二叉樹平衡,這就是平衡二叉樹的基本思想

代碼實現:

# -*- coding:utf-8 -*-# 日期:2018/6/12 8:37# Author:小鼠標# 節點對象class Node:  def __init__(self):    self.left_children = None    self.left_height = 0    self.right_children = None    self.right_height = 0    self.value = None# 二叉樹對象class tree:  def __init__(self):    self.root = False    self.front_list = []    self.middle_list = []    self.after_list = []  # 生成二叉樹  def create_tree(self,n=0,l=[]):    if l == []:      print("傳入的列表為空")      return    if n > len(l)-1:      print("二叉樹生成")      return    node = Node()    node.value = l[n]    if not self.root:      self.root = node      self.list = l    else:      self.add(self.root,node)    self.create_tree(n+1,l)  # 添加節點  def add(self,parent,new_node):    if new_node.value > parent.value:      # 插入值比父親值大,所以在父節點右邊      if parent.right_children == None:        parent.right_children = new_node        # 新插入節點的父親節點的高度值為1,也就是子高度值0+1        parent.right_height = 1        # 插入值后 從下到上更新節點的height      else:        self.add(parent.right_children,new_node)        # 父親節點的右高度等于右孩子,左右高度中較大的值 + 1        parent.right_height = max(parent.right_children.right_height, parent.right_children.left_height) + 1        # ======= 此處開始判斷平衡二叉樹=======        # 右邊高度大于左邊高度 屬于右偏        if parent.right_height - parent.left_height >= 2:          self.right_avertence(parent)    else:      # 插入值比父親值小,所以在父節點左邊      if parent.left_children == None:        parent.left_children = new_node        parent.left_height = 1      else:        self.add(parent.left_children,new_node)        parent.left_height = max(parent.left_children.right_height, parent.left_children.left_height) + 1        # ======= 此處開始判斷平衡二叉樹=======        # 左邊高度大于右邊高度 屬于左偏        if parent.left_height - parent.right_height >= 2:          self.left_avertence(parent)  # 更新當前節點下的所有節點的高度  def update_height(self,node):    # 初始化節點高度值為0    node.left_height = 0    node.right_height = 0    # 是否到最底層的一個    if node.left_children == None and node.right_children == None:      return    else:      if node.left_children:        self.update_height(node.left_children)        # 當前節點的高度等于左右子節點高度的較大值 + 1        node.left_height = max(node.left_children.left_height,node.left_children.right_height) + 1      if node.right_children:        self.update_height(node.right_children)        # 當前節點的高度等于左右子節點高度的較大值 + 1        node.right_height = max(node.right_children.left_height, node.right_children.right_height) + 1      # 檢查是否仍有不平衡      if node.left_height - node.right_height >= 2:        self.left_avertence(node)      elif node.left_height - node.right_height <= -2:        self.right_avertence(node)  def right_avertence(self,node):    # 右偏 就將當前節點的最左節點做父親    new_code = Node()    new_code.value = node.value    new_code.left_children = node.left_children    best_left = self.best_left_right(node.right_children)    v = node.value    # 返回的對象本身,    if best_left == node.right_children and best_left.left_children == None:      # 說明當前節點沒有有節點      node.value = best_left.value      node.right_children = best_left.right_children    else:      node.value = best_left.left_children.value      best_left.left_children = best_left.left_children.right_children    node.left_children = new_code    self.update_height(node)  # 處理左偏情況  def left_avertence(self,node):    new_code = Node()    new_code.value = node.value    new_code.right_children = node.right_children    best_right = self.best_left_right(node.left_children,1)    v = node.value    # 返回的對象本身,    if best_right == node.left_children and best_right.right_children == None:      # 說明當前節點沒有有節點      node.value = best_right.value      node.left_children = best_right.left_children    else:      node.value = best_right.right_children.value      best_right.right_children = best_right.right_children.left_children    node.right_children = new_code    self.update_height(node)  # 返回node節點最左(右)子孫的父級  def best_left_right(self,node,type=0):    # type=0 默認找最左子孫    if type == 0:      if node.left_children == None:        return node      elif node.left_children.left_children == None:        return node      else:        return self.best_left_right(node.left_children,type)    else:      if node.right_children == None:        return node      elif node.right_children.right_children == None:        return node      else:        return self.best_left_right(node.right_children,type)  # 前序(先中再左最后右)  def front(self,node=None):    if node == None:      self.front_list = []      node = self.root    # 輸出當前節點    self.front_list.append(node.value)    # 先判斷左枝    if not node.left_children == None:      self.front(node.left_children)    # 再判斷右枝    if not node.right_children == None:      self.front(node.right_children)    # 返回最終結果    return self.front_list  # 中序(先左再中最后右)  def middle(self,node=None):    if node == None:      node = self.root    # 先判斷左枝    if not node.left_children == None:      self.middle(node.left_children)    # 輸出當前節點    self.middle_list.append(node.value)    # 再判斷右枝    if not node.right_children == None:      self.middle(node.right_children)    return self.middle_list  # 后序(先左再右最后中)  def after(self,node=None):    if node == None:      node = self.root    # 先判斷左枝    if not node.left_children == None:      self.after(node.left_children)    # 再判斷右枝    if not node.right_children == None:      self.after(node.right_children)    self.after_list.append(node.value)    return self.after_list  # 節點刪除  def del_node(self,v,node=None):    if node == None:      node = self.root      # 刪除根節點      if node.value == v:        self.del_root(self.root)        return    # 刪除當前節點的左節點    if node.left_children:      if node.left_children.value == v:        self.del_left(node)        return    # 刪除當前節點的右節點    if node.right_children:      if node.right_children.value == v:        self.del_right(node)        return    if v > node.value:      if node.right_children:        self.del_node(v, node.right_children)      else:        print("刪除的元素不存在")    else:      if node.left_children:        self.del_node(v, node.left_children)      else:        print("刪除的元素不存在")  #刪除當前節點的右節點  def del_right(self,node):    # 情況1 刪除節點沒有右枝    if node.right_children.right_children == None:      node.right_children = node.right_children.left_children    else:      best_left = self.best_left_right(node.right_children.right_children)      # 表示右枝最左孫就是右枝本身      if best_left == node.right_children.right_children and best_left.left_children == None:        node.right_children.value = best_left.value        node.right_children.right_children = best_left.right_children      else:        node.right_children.value = best_left.left_children.value        best_left.left_children = best_left.left_children.right_children  # 刪除當前節點的左節點  def del_left(self,node):    # 情況1 刪除節點沒有右枝    if node.left_children.right_children == None:      node.left_children = node.left_children.left_children    else:      best_left = self.best_left_right(node.left_children.right_children)      # 表示右枝最左子孫就是右枝本身      if best_left == node.left_children.right_children and best_left.left_children == None:        node.left_children.value = best_left.value        node.left_children.right_children = best_left.right_children      else:        node.left_children.value = best_left.left_children.value        best_left.left_children = best_left.left_children.right_children  # 刪除根節點  def del_root(self,node):    if node.right_children == None:      if node.left_children == None:        node.value = None      else:        self.root = node.left_children    else:      best_left = self.best_left_right(node.right_children)      # 表示右枝最左子孫就是右枝本身      if best_left == node.right_children and best_left.left_children == None:        node.value = best_left.value        node.right_children = best_left.right_children      else:        node.value = best_left.left_children.value        best_left.left_children = best_left.left_children.right_children  # 搜索  def search(self,v,node=None):    if node == None:      node = self.root    if node.value == v:      return True    if v > node.value:      if not node.right_children == None:        return self.search(v, node.right_children)    else:      if not node.left_children == None:        return self.search(v, node.left_children)    return Falseif __name__ == '__main__':  # 需要建立二叉樹的列表  list = [4, 6, 3, 1, 7, 9, 8, 5, 2]  t = tree()  t.create_tree(0,list)  res = t.front()  print('前序', res)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品视频白浆免费视频| 亚洲深夜福利在线| 91久久久久久久久久久| 琪琪亚洲精品午夜在线| 国产视频在线观看一区二区| 亚洲欧美日韩中文视频| 欧美激情视频在线观看| 亚洲视频综合网| 欧美极品少妇xxxxⅹ免费视频| 精品无码久久久久久国产| 国产精品扒开腿做爽爽爽视频| 欧美极品第一页| 国产v综合v亚洲欧美久久| 国产激情视频一区| 色婷婷**av毛片一区| 中文字幕国产亚洲2019| 亚洲一区国产精品| 亚洲黄色在线观看| 久久久久国产精品www| 久久激情视频久久| 亚洲热线99精品视频| 欧美亚洲日本网站| 在线观看日韩视频| 日韩国产在线播放| 国产精品网红福利| 成人av色在线观看| 另类少妇人与禽zozz0性伦| 久久这里只有精品视频首页| 97欧美精品一区二区三区| 一区二区三区天堂av| 久久在线视频在线| 久久精品国产v日韩v亚洲| 亚洲国产小视频在线观看| 亚洲xxxx妇黄裸体| 欧美高清电影在线看| 国产一区二区在线播放| 日韩欧美国产视频| 欧美在线观看一区二区三区| 亚洲精品少妇网址| 亚洲欧美在线第一页| 欧美理论电影在线观看| 欧美一区二区三区图| 亚洲精品美女久久| 欧美激情久久久久久| 日韩欧美中文字幕在线观看| 在线观看成人黄色| 国产精品第100页| 日本免费一区二区三区视频观看| 日韩免费看的电影电视剧大全| 欧美成人午夜激情视频| 综合激情国产一区| 精品国产乱码久久久久久天美| 在线视频欧美日韩| 亚洲欧美在线x视频| 91网站在线看| 亚洲一区二区在线播放| 色噜噜狠狠狠综合曰曰曰88av| 久久中文字幕一区| 91高清视频免费观看| 96pao国产成视频永久免费| 色婷婷综合久久久久中文字幕1| 26uuu亚洲国产精品| 国产精品久久久999| 欧美日本中文字幕| 久精品免费视频| 国产精品久久久久久久电影| 国内精品久久久久| 日韩电影第一页| 久久亚洲精品网站| 亚洲sss综合天堂久久| 欧美激情手机在线视频| 国内精品模特av私拍在线观看| 一本色道久久综合狠狠躁篇的优点| 曰本色欧美视频在线| 欧美日韩不卡合集视频| 欧美激情视频给我| 日韩高清欧美高清| 在线观看日韩欧美| 国产91色在线免费| 日韩精品免费综合视频在线播放| 国产精品黄页免费高清在线观看| 91香蕉嫩草影院入口| 精品少妇v888av| 超在线视频97| 伊人伊成久久人综合网站| 国产高清在线不卡| 亚洲第一av网| 日韩精品亚洲精品| 久久亚洲精品毛片| 亚洲第一区中文99精品| 欧洲永久精品大片ww免费漫画| 欧美精品在线第一页| 欧美精品第一页在线播放| 亚洲综合日韩中文字幕v在线| 成人黄色大片在线免费观看| 久久久久久网站| 亚洲伊人久久综合| 亚洲欧美日韩在线高清直播| 亚洲人成电影在线观看天堂色| 一区二区三区视频免费在线观看| 亚洲一区二区自拍| 日韩欧美在线视频日韩欧美在线视频| 亚洲丝袜在线视频| 欧美性xxxxxxx| 在线日韩第一页| 亚洲综合最新在线| 亚洲欧洲美洲在线综合| 日韩精品中文字幕在线| 亚洲色图美腿丝袜| 欧美精品电影免费在线观看| 日韩高清电影免费观看完整版| 欧美激情综合色| 在线播放日韩精品| 亚洲老板91色精品久久| 色妞色视频一区二区三区四区| 性欧美在线看片a免费观看| 国产精品白嫩初高中害羞小美女| 日韩中文字幕不卡视频| 日韩中文字幕免费视频| 91精品国产免费久久久久久| 欧美中文字幕精品| 亚洲a一级视频| 欧美性猛交xxxx偷拍洗澡| 日本精品在线视频| 国产精品男女猛烈高潮激情| 久久激情视频免费观看| 怡红院精品视频| 欧美一二三视频| 热久久这里只有| 国产欧美日韩亚洲精品| 精品久久国产精品| 国产精品老女人精品视频| 亚洲精品国产suv| 成人综合国产精品| 黑人巨大精品欧美一区二区三区| 91理论片午午论夜理片久久| 欧美日韩国产中文精品字幕自在自线| 性色av一区二区三区在线观看| 中国日韩欧美久久久久久久久| 7m精品福利视频导航| 一区二区三区视频观看| 91性高湖久久久久久久久_久久99| 米奇精品一区二区三区在线观看| 精品露脸国产偷人在视频| 欧美猛少妇色xxxxx| 亚洲夜晚福利在线观看| 自拍偷拍免费精品| 亚洲人av在线影院| 欧美在线视频在线播放完整版免费观看| 黄色一区二区三区| 91精品国产高清自在线| 亚洲欧洲一区二区三区久久| 亚洲成av人影院在线观看| 日韩欧美主播在线| 精品久久久久久久久久ntr影视| 国内偷自视频区视频综合| 久久久久久成人精品| 日韩免费在线电影| 午夜精品一区二区三区视频免费看| 国产精品黄色av| 日韩av在线播放资源| 国产视频在线一区二区| 欧美成aaa人片免费看| 亚洲va欧美va国产综合久久|