【最后一遍 第7章搜索树】


二叉搜索树以BST简称

7.1 二叉搜索树

定义: 二叉搜素树或者是一棵空二叉树,有如下性质
1. 二叉树中任意两个结点关键字值不相等
2. 若左子树不空,左子树上的所有结点的关键字值均小于根结点关键字值
3. 若右子树不空,右子树上的所有结点的关键字值均大于根节点关键字值
4. 左、右子树分别是一棵二叉树
中序遍历一棵BST,得到关键字值递增序列的有序序列,所以也称为二叉排序树

二叉搜索树递归搜索

BTnode search(BTnode T,int key){
   if(T=NULL){
     return NULL;    
   }
   if(T->data===key)
     return T;
   else if(key<T->data){
     return search(T->lchild,k);
   }else{
    return search(T->rchild,k);
   }
}

二叉搜索树时间效率与其高度相关;

二叉搜索树的插入

BTnode * insert(BTnode *bt,int key){
   if(bt==NULL){
    BTnode  *p=(BTnode*)malloc(sizeof(BTnode));
    p->lchild=NULL;
    p->rchild=NULL;
    p->data=key;
   }
   else if(key>bt->data){
        bt->rchild=insert(bt->rchild,key);
   }
   else if(key<bt->data){
        bt->lchild=insert(bt->lchild,key);
   }
   return bt;
}

二叉搜索树的删除

  1. 删除叶子结点,只需要结点对应的双亲结点的孩子置为NULL即可;
  2. 删除只有一棵非空子树的非叶子结点只要令其唯一非空子树取代即可
  3. 删除有两棵非空子树的非叶子结点时,可用左子树最大元素或者右子树最小元素替代该节点;然后删除替代的结点即可;
  4. BST任意一棵子树中最大元素与最小元素所在的结点度一定是0或者1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 平衡二叉搜索(Balanced Binary Search Tree)是一种特殊的二叉搜索,它具有以下特点: 1. 每个节点的左子和右子的高度差不超过 1。 2. 每个节点都有一个平衡因子,它是左子的高度减去右子的高度。平衡因子的值只能是-1、0、1。 下面是一个简单的平衡二叉搜索的例子: ``` 4 / \ 2 5 / \ \ 1 3 6 ``` 这棵平衡二叉搜索满足以下条件: - 对于每个节点,它的左子和右子的高度差都不超过 1。 - 对于节点 4,它的平衡因子是 0。对于节点 2,它的平衡因子是 -1。对于节点 5,它的平衡因子是 1。 平衡二叉搜索的优点在于,它能够保证插入、删除和查找操作的时间复杂度都是 O(logn),这使得它在处理大量数据时能够保证较快的速度。常见的平衡二叉搜索有 AVL、红黑和Treap。 ### 回答2: 平衡二叉搜索(AVL)是一种自平衡的二叉搜索,它的左右子的高度差不超过1。下面是一个实现平衡二叉搜索的例子: 1. 首先,定义节点类。节点类包含一个键和对应的值,以及左右子的指针。 ``` class Node: def __init__(self, key, value): self.key = key self.value = value self.left = None self.right = None self.height = 1 ``` 2. 创建平衡二叉搜索类,包含插入、删除和查找等方法。在中插入节点时,需要保持平衡。 ``` class AVLTree: def __init__(self): self.root = None # 获取节点的高度 def get_height(self, node): if node is None: return 0 return node.height # 更新节点的高度 def update_height(self, node): node.height = 1 + max(self.get_height(node.left), self.get_height(node.right)) # 获取节点的平衡因子 def get_balance_factor(self, node): if node is None: return 0 return self.get_height(node.left) - self.get_height(node.right) # 向中插入节点 def insert(self, key, value): self.root = self._insert(self.root, key, value) # 插入节点的辅助函数 def _insert(self, node, key, value): if node is None: return Node(key, value) if key < node.key: node.left = self._insert(node.left, key, value) else: node.right = self._insert(node.right, key, value) # 更新节点的高度 self.update_height(node) # 平衡 balance_factor = self.get_balance_factor(node) if balance_factor > 1: if key < node.left.key: node = self._rotate_right(node) # LL型 else: node.left = self._rotate_left(node.left) # LR型 node = self._rotate_right(node) elif balance_factor < -1: if key > node.right.key: node = self._rotate_left(node) # RR型 else: node.right = self._rotate_right(node.right) # RL型 node = self._rotate_left(node) return node # 左旋转 def _rotate_left(self, node): new_root = node.right node.right = new_root.left new_root.left = node # 更新旋转后节点的高度 self.update_height(node) self.update_height(new_root) return new_root # 右旋转 def _rotate_right(self, node): new_root = node.left node.left = new_root.right new_root.right = node # 更新旋转后节点的高度 self.update_height(node) self.update_height(new_root) return new_root ``` 这样,我们就可以使用AVLTree类来创建并操作平衡二叉搜索了。当插入或删除一个节点时,我们会根据节点的键值进行比较,并保持的平衡性。这样可以提高搜索效率,并确保的高度始终保持平衡。 ### 回答3: 平衡二叉搜索(Balanced Binary Search Tree)是一种特殊的二叉搜索,它的左右子的高度差始终在一个固定的范围内,以确保的平衡性和高效性。 构建平衡二叉搜索的常用方法是AVL。AVL是一种自平衡二叉搜索,其平衡因子(左右子高度之差)满足平衡条件。 具体构建过程如下: 1. 首先,构建一个空作为起始状态。 2. 从待插入节点集合中选择一个节点作为根节点。 3. 将根节点插入空,并根据的特点进行平衡操作。 4. 从待插入节点中选择一个节点,将其插入中。 5. 检查的平衡状态,如果不平衡,则进行相应的旋转操作恢复平衡。 6. 重复步骤4和5,直到所有节点均被插入中。 7. 完成后,平衡二叉搜索构建完成。 在插入节点时,根据具体情况进行左旋、右旋、左右旋或右左旋等操作,以保持的平衡。旋转操作会调整节点的位置以及子的链接关系,使保持平衡性。 通过AVL的构建,可以保证的高度始终在一个较小的范围内,从而提高搜索、插入和删除等操作的效率。 总之,构建平衡二叉搜索的过程就是不断插入节点并进行平衡操作的过程。通过合适的旋转操作,保证的平衡性,从而提高的性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱喝阔落的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值