• 二叉树的python实现


    1.二叉树是一种遵守以下规则的树:

      每个结点的子结点数量可为0,1,2

      如果有两个子结点,则其中一个子结点的值必须小于父结点,另一个子结点的值必须大于父结点

    2. 二叉树查找算法先从根结点开始

      (1)检视该结点的值

      (2)如果正是所要找的值,返回根结点

      (3)如果要找的值小于当前结点的值,则再该结点的左子树查找

      (4)如果要找的值大于当前结点的值,则在该结点的右子树查找

    3.二叉树插入也是先从根结点开始

      找到要插入的值应该被链接到哪个叶结点

      要插入的值大于该叶结点的值,将该值插到该叶结点的右边

      要插入的值小于该叶结点的值,将该值插到该叶结点的左边

    4.二叉树的删除算法规则

      (1)如果要删除的结点没有子结点,那就直接删除它就好了

      (2)如果要删除的结点有一个子结点,那就删除它之后,还要将子结点填到被删除结点的位置上

      (3)如果要删除的结点有两个子结点,则将该结点替换成其后继结点。一个结点的后继结点,就是所有比被删除结点大的子结点中,最小的一个

          • 如果后继结点带有右子结点,则在后继结点填补被删除结点以后,用此有子结点替代后继结点的父结点的左子结点

      1 # 树结点
      2 class TreeNode:
      3     def __init__(self, value, left=None, right=None):
      4         self.value = value
      5         self.leftChild = left
      6         self.rightChild = right
      7 
      8     # 查找(二叉树的查找算法先从根结点开始)
      9     def tree_search(self, value, node):
     10         # 基准情形: 如果node不存在或者node的值符合
     11         if node is None or node.value == value:
     12             return node
     13 
     14         # 如果node存在但value小于当前结点的值,那就从左子结点出继续往下查找
     15         elif value < node.value:
     16             return self.tree_search(value, node.leftChild)
     17 
     18         # 如果node存在但value大于当前结点的值,那就从右子结点出继续往下查找
     19         elif value > node.value:
     20             return self.tree_search(value, node.rightChild)
     21 
     22     # 插入
     23     def tree_insert(self, value, node):
     24         # 如果node存在但value小于当前结点的值,那就从左子结点出继续往下查找
     25         if value < node.value:
     26             # 如果左子结点不存在,则将新值作为左子结点
     27             if node.leftChild is None:
     28                 node.leftChild = TreeNode(value)
     29             else:
     30                 self.tree_search(value, node.leftChild)
     31         # 如果node存在但value大于当前结点的值,那就从右子结点出继续往下查找
     32         elif value> node.value:
     33             # 如果右子结点不存在,则将新值作为右子结点
     34             if node.rightChild is None:
     35                 node.rightChild = TreeNode(value)
     36             else:
     37                 self.tree_search(value, node.rightChild)
     38 
     39     # 删除
     40     def tree_delete(self, delete_value, node):
     41         # 基准情形: 当前位置的上一层无子结点,说明已经到达书的底层
     42         if node is None:
     43             return None
     44 
     45         # 如果要删除的值小于当前结点,则以左子树为参数,递归调用方法,然后将当前接待你的左链指向返回的结点
     46         elif delete_value < node.value:
     47             node.leftChild = self.tree_delete(delete_value, node.leftChild)
     48             # 将当前结点(及其子树,如果存在的话)返回。将作为其父结点的新左子结点(或新右子结点)
     49             return node
     50 
     51         # 如果要删除的值大于当前结点,则以右子树为参数,递归调用方法,然后将当前接待你的右链指向返回的结点
     52         elif delete_value > node.value:
     53             node.rightChild = self.tree_delete(delete_value, node.rightChild)
     54             # 将当前结点(及其子树,如果存在的话)返回。将作为其父结点的新右子结点(或新左子结点)
     55             return node
     56 
     57         # 如果要删除的值正是当前结点
     58         elif delete_value == node.value:
     59             # 如果当前结点没有左子结点,有右子结点,则以右子结点(及其子树,如果存在的话)替换当前删除结点成为当前删除结点之父结点的新子结点
     60             # 如果当前结点没有左子结点,也没有右子结点,那就返回None
     61             # 如果当前结点没有右子结点,有左子结点,则以左子结点(及其子树,如果存在的话)替换当前删除结点成为当前删除结点之父结点的新子结点
     62             if node.leftChild is None:
     63                 return node.rightChild
     64             elif node.rightChild is None:
     65                 return node.leftChild
     66 
     67             # 剩下的情况只有 当前结点有左子结点和右子结点
     68             # 如果当前结点有两个子结点,调用lift函数来作删除(它会使当前结点的值变为其后继结点的值)
     69             else:
     70                 node.rightChild = self.tree_lift(node.rightChild, node)
     71 
     72                 return node
     73 
     74     def tree_lift(self, node, delete_node):
     75         # 如果此函数的当前结点有左子结点,则递归调用本函数,从左子树找出后继结点
     76         if node.leftChild:
     77             node.leftChild = self.tree_lift(node.leftChild, delete_node)
     78             return node
     79         # 如果此函数的当前结无左子结点,则代表当前结点是后继结点,于是将其值设置为被删除结点的新值
     80         else:
     81             delete_node.value = node.value
     82             # 用后继结点的右子结点替代后继结点的父结点的左子结点
     83             return node.rightChild
     84 
     85     # 中序遍历
     86     def in_order(self, node):
     87         if not node:
     88             return
     89         self.in_order(node.leftChild)
     90         print(node.value, end=',')
     91         self.in_order(node.rightChild)
     92 
     93 if __name__ == '__main__':
     94     node4 = TreeNode(4)
     95     node11 = TreeNode(11)
     96     node30 = TreeNode(30)
     97     node40 = TreeNode(40)
     98     node52 = TreeNode(52)
     99     node61 = TreeNode(61)
    100     node82 = TreeNode(82)
    101     node95 = TreeNode(95)
    102     node10 = TreeNode(10, node4, node11)
    103     node33 = TreeNode(33, node30, node40)
    104     node56 = TreeNode(56, node52, node61)
    105     node89 = TreeNode(89, node82, node95)
    106     node25 = TreeNode(25, node10, node33)
    107     node75 = TreeNode(75, node56, node89)
    108     node50 = TreeNode(50, node25, node75)
    109 
    110     # res_search = node50.tree_search(56, node50)
    111 
    112     # print(res_search.value, res_search.leftChild, res_search.rightChild)
    113 
    114     # node50.tree_insert(92, node50)
    115 
    116     # node50.tree_delete(33, node50)
    117 
    118     # 中序遍历
    119     node50.in_order(node50)
    120 
    121     """
    122     # 删除树结点过程
    123                         50
    124                 25               75
    125             10       33      56        89
    126         4       11 30   40 52   61  82     95
    127     1.删除30
    128     <1>tree_delete(30, node50):
    129         elif 30 < node50: 
    130             node50.leftChild=<2>tree_delete(30, node25)
    131                                  elif 30 > node25: 
    132                                      node25.rightChild=<3>tree_delete(30, node33)                        
    133                                                            elif 30 < node33.value: 
    134                                                                node33.leftChild = <4>tree_delete(30, node30)
    135                                                                                      elif 30 = node30: 
    136                                                                                          if node30.leftChild is None:
    137                                                                                              <4>return None                                                                                                               
    138                                                         <3>return node33
    139                              <2>return node25
    140     <1>return node50
    141 
    142                         50
    143                 25               75
    144             10       33      56        89
    145         4       11      40 52   61  82     95
    146     2. 删除56
    147     tree_delete(56, node50)
    148         elif 56 > node50:
    149             node50.rightChild = tree_delete(56, node75)
    150                                     elif 56 < node75:
    151                                         node75.leftChild = tree_delete(56, node56)
    152                                                                elif 56 = node56:
    153                                                                    # node56 有两个子结点
    154                                                                    else:
    155                                                                         node56.rightChild=tree_lift(node61, node56)
    156                                                             return node56
    157                                 return node75
    158     return node50                   
    159 
    160     tree_lift(node61, node56)
    161         else: # node61无左子结点
    162             node56.value = node61.value
    163             return node61.rightChild  # return None
    164                         50
    165                 25               75
    166             10       33      61        89
    167         4       11      40 52       82     95
    168 
    169     3. 删除25
    170     tree_delete(25, node50)
    171         elif 25 < node50:
    172             node50.leftChild = tree_delete(25, node25)
    173                                     elif 25 = node25:
    174                                         # node25 有两个子结点
    175                                         else:
    176                                             node25.rightChild = tree_lift(node33, node25)
    177                                 return node25
    178     return node50
    179 
    180     tree_lift(node33, node25)
    181         else:
    182             node25.value = node33.value
    183             return node40
    184                         50
    185                 25               75
    186             10       33      61        89
    187         4       11      40 52       82     95
    188 
    189     4.删除50
    190     tree_delete(50, node50)
    191         elif 50 = node50:
    192             # node50有两个子结点
    193             else:
    194                 node50.rightChild = tree_lift(node75, node50)
    195     return node50
    196 
    197     tree_lift(node75, node50)
    198         if node75.leftChild:
    199             node75.leftChild = tree_delete(node61, node50)
    200                                     if node61.leftChild:
    201                                     node61.leftChild = tree_delete(node52, node50)
    202                                                             # 如果此函数的当前结无左子结点,则代表当前结点是后继结点,于是将其值设置为被删除结点的新值
    203                                                             else:
    204                                                                 node50.value = node52.value
    205                                                                 return node52.rightChild  # None
    206                                 return node61
    207     return node75
    208 
    209     """
    210 
    211     """
    212     # 中序遍历过程
    213     in_order(node50)
    214         in_order(node25)
    215             in_order(node10)
    216                 in_order(node4)
    217                     print(node4.value)   1
    218                         return
    219                 print(node10.value)      2
    220                 in_order(node11) 
    221                     print(node11.value)  3
    222                         return
    223             print(node25.value)          4
    224             in_order(node33)
    225                 in_order(node30)
    226                     print(node30.value)  5
    227                         return
    228                 print(node33.value)      6
    229                 in_order(node40)
    230                     print(node40.value)  7
    231                         return          
    232         print(node50.value)              8  
    233         in_order(node75)
    234             in_order(node56)
    235                 in_order(node52)
    236                     print(node52.value)  9
    237                         return
    238                 print(node56.value)      10
    239                 in_order(node61)
    240                     print(node61.value)  11
    241                         return
    242             print(node75.value)           12
    243             in_order(node89)
    244                 in_order(node82)
    245                     print(node82.value)   13
    246                         return
    247                 print(node33.value)        14
    248                 in_order(node95)
    249                     print(node95.value)    15
    250                         return
    251     """
  • 相关阅读:
    《动手能力强与技术水平低》(2009/12/14)
    《为什么程序员被喻为“IT农民工”》(2009/12/12)
    对于关键字Ref和Out的理解
    2008世界500强排名(1100位)
    Javascript取select的选中值和文本
    使用 FreeNAS 下載 eMule
    程序员35岁后的三条出路
    二维条码 QR Code
    笔记本CPU性能排行榜Comparison of Mobile Processors (CPU Benchmarks)
    如何在C#中播放AVI短片并使背景透明
  • 原文地址:https://www.cnblogs.com/glz666/p/13873696.html
Copyright © 2020-2023  润新知