python实现-满二叉排序树中查找三个节点的最小子树的根节点

题目描述:

于一棵满二叉排序树深度为k,节点数为2^k-1;节点值为1至(2^k - 1),给出k和任意三个节点的值,输出包含该三个节点的最小子树的根节点。

样例输入:4 10 15 13

样例输出:12

首先,我们来理解一下满二叉排序树,如下就是一个4层的满二叉排序树:
满二叉树

根据上图可以看出,满二叉排序树的中序遍历是从1到2^k - 1的递增序列(k为层数)。所以,只要给出层数我们就能够确定这个二叉排序树。同时,观察可知,二叉排序树从上到下的根节点刚好是所有元素进行二分查找的中间节点。

根据上面的规律要解决三个节点的最小子树的根节点这个问题可以得到如下几点:

无须建立二叉树,从1-2^k - 1的递增数组即就是一个满二叉排序树
当输入的三个元素在二分节点两侧时,当前的二分节点就是要查找的最小子树的根节点(根据这个规则,我们也无需判断三个元素,只需判断最大元素和最小元素的位置即可)
当最小节点的值大于二分节点的值,则继续在二分的右半部分进行查找
当最大节点的值小于二分节点的值,则继续在二分的左半部分进行查找
根据如上几点,编写 python 代码如下:

K, a, b ,c = map(int, raw_input().split())
print K,a,b,c
maxvalue = max(a,b,c)
minvalue = min(a,b,c)
left = 1
right = pow(2, K)-1
middle = (left + right)/2
while True:
    if minvalue < middle and middle < maxvalue:
        break
    if middle < minvalue:
        left = middle + 1
        middle = (left + right) / 2
    elif middle > maxvalue:
        right = middle - 1
        middle = (left + right) / 2

print middle
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是 Python 代码实现: ```python class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None class BinarySearchTree: def __init__(self): self.root = None def insert(self, val): if not self.root: self.root = TreeNode(val) return cur = self.root while cur: if val < cur.val: if not cur.left: cur.left = TreeNode(val) return cur = cur.left else: if not cur.right: cur.right = TreeNode(val) return cur = cur.right def search(self, val): cur = self.root while cur: if val == cur.val: return True elif val < cur.val: cur = cur.left else: cur = cur.right return False def delete(self, val): def find_min(node): while node.left: node = node.left return node def delete_node(root, val): if not root: return root if val < root.val: root.left = delete_node(root.left, val) elif val > root.val: root.right = delete_node(root.right, val) else: if not root.left and not root.right: root = None elif not root.left: root = root.right elif not root.right: root = root.left else: min_node = find_min(root.right) root.val = min_node.val root.right = delete_node(root.right, min_node.val) return root self.root = delete_node(self.root, val) ``` 其,`TreeNode` 表示二叉排序树节点,包含 `val` 值、`left` 左子树、`right` 右子树。`BinarySearchTree` 表示二叉排序树,包含 `root` 节点三个操作 `insert` 插入、`search` 查找、`delete` 删除。 在 `insert` 操作,如果节点为空,则直接插入;否则,从节点开始遍历,如果插入的值比当前节点小,则往左子树遍历;如果插入的值比当前节点大,则往右子树遍历;直到找到一个节点,其左或右子树为空,此时插入新节点。 在 `search` 操作,从节点开始遍历,如果查找的值等于当前节点的值,则返回 True;如果查找的值小于当前节点的值,则往左子树遍历;如果查找的值大于当前节点的值,则往右子树遍历;直到遍历完整棵树都没有找到,则返回 False。 在 `delete` 操作,分为三种情况: 1. 要删除的节点没有子节点,直接将其置为 None。 2. 要删除的节点只有一个子节点,将该子节点替换到要删除的节点的位置上。 3. 要删除的节点有两个子节点,先找到右子树最小节点,将该节点的值赋给要删除的节点,然后再递归删除右子树最小节点。 最后,我们可以按照以下步骤使用上述代码: 1. 创建一个二叉排序树对象 `bst = BinarySearchTree()`。 2. 读入一串字符,通过 `split()` 方法将其拆分成多个字符串,并将其转换成整数类型。 3. 遍历这些整数,在二叉排序树插入每一个数,即 `bst.insert(num)`。 4. 可以使用 `bst.search(val)` 查找指定的值是否在二叉排序树。 5. 可以使用 `bst.delete(val)` 删除指定的值在二叉排序树节点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值