Python实现二叉树排序和AVL平衡树的插入

下面是python实现二叉树排序代码

​
sortlist=[4,72,81,6,73,124,65,68,66]
class Node(object):
    def __init__(self,value):
        self.left=None
        self.right=None
        self.parent=None
        self.value=value

def buidtree(tree):   #   返回非空节点个数
    if tree==None:
        return 0
    elif tree.left==None and tree.right==None:
        return 1
    return buidtree(tree.left)+buidtree(tree.right)+1
    
def createTree(tree,value):    #  创建树
    if tree.left==None:
        tree.left=Node(value)
        tree.left.parent=tree
        return
    elif tree.right==None:
        tree.right=Node(value)
        tree.right.parent=tree
        return
    if buidtree(tree.left)-buidtree(tree.right)*2==1:   #   判断加入左还是右
        createTree(tree.right,value)
    else:
        createTree(tree.left,value)


root=Node(sortlist[0])
for i in sortlist[1:]:
    createTree(root,i)

def falstbult(tree):    #   先序遍历
    if tree==None:
        return []
    else:
        return [tree.value]+falstbult(tree.left)+falstbult(tree.right)

def mbult(tree):    #   中序遍历
    if tree==None:
        return []
    else:
        return mbult(tree.left)+[tree.value]+mbult(tree.right)
    
def paixu(node,ccount,change):   #   排序
    if node==None or node.left==None:
        return ccount,change
    elif node.right==None:
        if node.value<node.left.value:
            ccount+=1
            change=True
            tmpe=node.value 
            node.value=node.left.value   #   局部排序    
            node.left.value=tmpe
        return ccount,change
    else :
        if node.value<node.left.value:
            ccount+=1
            change=True
            tmpe=node.value 
            node.value=node.left.value   #   局部排序    
            node.left.value=tmpe
        if node.right.value<node.value:
            ccount+=1
            change=True
            tmpe=node.value 
            node.value=node.right.value   #   局部排序    
            node.right.value=tmpe
        if node.value<node.left.value:
            ccount+=1
            change=True
            tmpe=node.value 
            node.value=node.left.value   #   局部排序    
            node.left.value=tmpe
        if node.left.right!=None:
            if node.value<node.left.right.value:   #   跳出局部
                ccount+=1
                change=True
                tmpe=node.value 
                node.value=node.left.right.value   
                node.left.right.value=tmpe
        if node.right.left!=None:
            if node.value>node.right.left.value:   #   跳出局部
                ccount+=1
                change=True
                tmpe=node.value 
                node.value=node.right.left.value   
                node.right.left.value=tmpe
        
        
        cc,cg=paixu(node.left,ccount,change)
        return paixu(node.right,cc,cg)

root=Node(sortlist[0])
for i in sortlist[1:]:
    createTree(root,i)
print('初始化后的:',mbult(root))
print('原数据:',sortlist)

i=0
tiaojian=True
while tiaojian:
    i,tiaojian=paixu(root,i,False)
    
print('排序后的:',mbult(root))

结果为
初始化后的: [65, 6, 68, 72, 73, 4, 124, 81, 66]
原数据: [4, 72, 81, 6, 73, 124, 65, 68, 66]
排序后的: [4, 6, 65, 66, 68, 72, 73, 81, 124]

​

python实现AVL平衡二叉树的插入

insertlist=[5,72,78,1,77,2,656]

def treedree(tree):            #    返回树的深度
    if tree==None:
        return 0
    else :
        return max(treedree(tree.left)+1,treedree(tree.right)+1)
    

#
#       加入元素之后就需要往上 看哪个节点失衡    只要解决 这个失衡的节点就可以了   要由下至上不能由上至下

def lxuan(parent,sub):             #   左旋
    sub.parent=parent.parent
    if sub.parent!=None:
        if sub.parent.left==parent:
            sub.parent.left=sub
        else :
            sub.parent.right=sub
    parent.parent=sub
    if sub.left!=None:
        parent.right=sub.left
        sub.left.parent=parent
    else:
        parent.right=None
    sub.left=parent
def rxuan(parent,sub):             #   右旋
    sub.parent=parent.parent
    if sub.parent!=None:
        if sub.parent.left==parent:
            sub.parent.left=sub
        else :
            sub.parent.right=sub
    parent.parent=sub
    if sub.right!=None:
        parent.left=sub.right
        sub.right.parent=parent
    else:
        parent.left=None
    sub.right=parent
def avltree(tree,LorR=0):         #    平衡这棵树     从加入的节点往上遍历    所以传入的是加入节点   LorR -> -1  1
    #   如果左节点比右节点大 2   LL  LR   L
    #   如果有节点比左节点大 2   RR  RL   R
    #   于是往上去的时候要返回   左还是右
    #   平衡因子在这里就直接用深度比较代替
    
    info = treedree(tree.left)-treedree(tree.right)
    if info==2:
        if LorR==-1:         #     LL       一次右旋
            rxuan(tree,     tree.left)
            return True                        #   返回   True  代表改变过
        else:                #     LR       一次左旋加一次右旋
            lxuan(tree.left,  tree.left.right)
            rxuan(tree,  tree.left)
            return True
    elif info==-2:
        if LorR==-1:         #     RL       一次右旋加一次左旋
            rxuan(tree.right,  tree.right.left)
            lxuan(tree,  tree.right)
            return True
        else:                #     RR       一次左旋
            lxuan(tree,  tree.right)
            return True
    else :            #向上走
        if tree.parent==None:   #  到根节点了
            print('root')
            return False
        else:
            if tree==tree.parent.left:
                return avltree(tree.parent,-1)
            else :
                return avltree(tree.parent,1)
    
def pushvalue(tree,value):     #    二叉树中插入值
    if value<tree.value:
        if tree.left==None:
            tree.left=Node(value)
            tree.left.parent=tree
            avltree(tree.left)
        else:
            pushvalue(tree.left,value)
    else :
        if tree.right==None:
            tree.right=Node(value)
            tree.right.parent=tree
            avltree(tree.right)
        else:
            pushvalue(tree.right,value)

root=Node(sortlist[0])
for i in sortlist[1:]:
    createTree(root,i)
i=0
tiaojian=True
while tiaojian:
    i,tiaojian=paixu(root,i,False)
    
print('排序后的:',mbult(root))

print('插入前的:',mbult(root))
for i in insertlist:
    pushvalue(root,i)
print('插入后的:',mbult(root))

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个简单的 Python 实现平衡二叉树 (AVL Tree) 的代码示例: ```python class Node: def __init__(self, key): self.key = key self.left = None self.right = None self.height = 1 class AVL_Tree: def insert(self, root, key): if not root: return Node(key) elif key < root.key: root.left = self.insert(root.left, key) else: root.right = self.insert(root.right, key) root.height = 1 + max(self.getHeight(root.left), self.getHeight(root.right)) balance = self.getBalance(root) if balance > 1 and key < root.left.key: return self.rightRotate(root) if balance < -1 and key > root.right.key: return self.leftRotate(root) if balance > 1 and key > root.left.key: root.left = self.leftRotate(root.left) return self.rightRotate(root) if balance < -1 and key < root.right.key: root.right = self.rightRotate(root.right) return self.leftRotate(root) return root def leftRotate(self, z): y = z.right T2 = y.left y.left = z z.right = T2 z.height = 1 + max(self.getHeight(z.left), self.getHeight(z.right)) y.height = 1 + max(self.getHeight(y.left), self.getHeight(y.right)) return y def rightRotate(self, z): y = z.left T3 = y.right y.right = z z.left = T3 z.height = 1 + max(self.getHeight(z.left), self.getHeight(z.right)) y.height = 1 + max(self.getHeight(y.left), self.getHeight(y.right)) return y def getHeight(self, root): if not root: return 0 return root.height def getBalance(self, root): if not root: return 0 return self.getHeight(root.left) - self.getHeight(root.right) ``` 这个代码实现AVL 树的基本操作,包括插入节点、左旋、右旋和平衡因子的计算。 使用的时候只需要实例化 AVL_Tree 类,并调 ### 回答2: 平衡二叉树AVL树)是一种自平衡的二叉搜索树,任何节点的左子树和右子树的高度最多相差1。下面是用Python实现平衡二叉树代码: ```python # 定义二叉树节点类 class TreeNode: def __init__(self, value): self.data = value self.left = None self.right = None self.height = 1 # 节点的高度,默认为1 # 获取节点的高度 def get_height(node): if node is None: return 0 return node.height # 获取节点的平衡因子 def get_balance(node): if node is None: return 0 return get_height(node.left) - get_height(node.right) # 左旋操作 def left_rotate(z): y = z.right T2 = y.left y.left = z z.right = T2 z.height = max(get_height(z.left), get_height(z.right)) + 1 y.height = max(get_height(y.left), get_height(y.right)) + 1 return y # 右旋操作 def right_rotate(z): y = z.left T3 = y.right y.right = z z.left = T3 z.height = max(get_height(z.left), get_height(z.right)) + 1 y.height = max(get_height(y.left), get_height(y.right)) + 1 return y # 插入节点 def insert_node(root, value): if root is None: return TreeNode(value) elif value < root.data: root.left = insert_node(root.left, value) else: root.right = insert_node(root.right, value) root.height = max(get_height(root.left), get_height(root.right)) + 1 # 检测树的平衡性 balance_factor = get_balance(root) # 左左情况,进行右旋操作 if balance_factor > 1 and value < root.left.data: return right_rotate(root) # 右右情况,进行左旋操作 if balance_factor < -1 and value > root.right.data: return left_rotate(root) # 左右情况,先左旋再右旋 if balance_factor > 1 and value > root.left.data: root.left = left_rotate(root.left) return right_rotate(root) # 右左情况,先右旋再左旋 if balance_factor < -1 and value < root.right.data: root.right = right_rotate(root.right) return left_rotate(root) return root # 中序遍历,打印平衡二叉树 def in_order_traversal(root): if root: in_order_traversal(root.left) print(root.data, end=" ") in_order_traversal(root.right) # 测试代码 root = None root = insert_node(root, 10) root = insert_node(root, 20) root = insert_node(root, 30) root = insert_node(root, 40) root = insert_node(root, 50) root = insert_node(root, 25) print("平衡二叉树:") in_order_traversal(root) ``` 以上代码实现平衡二叉树插入操作,并进行了相应的旋转操作来维持平衡。可以通过中序遍历验证平衡二叉树的正确性。 ### 回答3: 平衡二叉树AVL树)是一种特殊的二叉搜索树,它的左右子树的高度差不超过1。 实现平衡二叉树代码,主要包含以下几个步骤: 1. 定义二叉树的节点类,包含节点值、左子节点、右子节点和高度等属性。 2. 定义平衡二叉树类,包含插入节点、删除节点、左旋转、右旋转、计算节点高度等方法。 3. 在插入节点、删除节点等操作中,通过判断节点的左子树和右子树的高度差,来判断是否需要进行旋转操作以保持树的平衡。 4. 左旋转和右旋转是平衡二叉树中常用的平衡操作,可以通过调整节点的左右子节点来保持树的平衡。 5. 计算节点的高度时,需要递归计算节点的左子树和右子树的高度,然后取较大值加1作为节点的高度。 6. 实现其他常用方法,如查找节点、遍历树等。 下面是一种可能的Python实现平衡二叉树代码示例: ```python class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None self.height = 1 class AVLTree: def __init__(self): self.root = None def insert(self, root, val): if not root: return TreeNode(val) elif val < root.val: root.left = self.insert(root.left, val) else: root.right = self.insert(root.right, val) root.height = 1 + max(self.get_height(root.left), self.get_height(root.right)) balance = self.get_balance(root) if balance > 1 and val < root.left.val: return self.right_rotate(root) if balance < -1 and val > root.right.val: return self.left_rotate(root) if balance > 1 and val > root.left.val: root.left = self.left_rotate(root.left) return self.right_rotate(root) if balance < -1 and val < root.right.val: root.right = self.right_rotate(root.right) return self.left_rotate(root) return root def delete(self, root, val): if not root: return root elif val < root.val: root.left = self.delete(root.left, val) elif val > root.val: root.right = self.delete(root.right, val) else: if not root.left: temp = root.right root = None return temp elif not root.right: temp = root.left root = None return temp temp = self.get_min_value_node(root.right) root.val = temp.val root.right = self.delete(root.right, temp.val) root.height = 1 + max(self.get_height(root.left), self.get_height(root.right)) balance = self.get_balance(root) if balance > 1 and self.get_balance(root.left) >= 0: return self.right_rotate(root) if balance < -1 and self.get_balance(root.right) <= 0: return self.left_rotate(root) if balance > 1 and self.get_balance(root.left) < 0: root.left = self.left_rotate(root.left) return self.right_rotate(root) if balance < -1 and self.get_balance(root.right) > 0: root.right = self.right_rotate(root.right) return self.left_rotate(root) return root def left_rotate(self, z): y = z.right T2 = y.left y.left = z z.right = T2 z.height = 1 + max(self.get_height(z.left), self.get_height(z.right)) y.height = 1 + max(self.get_height(y.left), self.get_height(y.right)) return y def right_rotate(self, z): y = z.left T3 = y.right y.right = z z.left = T3 z.height = 1 + max(self.get_height(z.left), self.get_height(z.right)) y.height = 1 + max(self.get_height(y.left), self.get_height(y.right)) return y def get_height(self, root): if not root: return 0 return root.height def get_balance(self, root): if not root: return 0 return self.get_height(root.left) - self.get_height(root.right) def get_min_value_node(self, root): if root is None or root.left is None: return root return self.get_min_value_node(root.left) def search(self, root, val): if not root or root.val == val: return root elif root.val < val: return self.search(root.right, val) else: return self.search(root.left, val) def inorder_traversal(self, root): res = [] if root: res = self.inorder_traversal(root.left) res.append(root.val) res = res + self.inorder_traversal(root.right) return res ``` 注意,这只是一种可能的实现,实际的代码可能会有所不同。可以根据具体需求和算法原理进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值