Python 二叉搜索树

集合有三个重要的分类,树就属于其中的层级结构。大多数编程语言并没有将树作为一种标准类型包含其中,尽管如此,树还是得到了广泛的应用,它可以很自然的表示物体的集合,例如,一个文件的目录结构和一本书的目录。

树的两个主要特征:

(1)每个项都有多个子节点

(2)除了叫做根的特殊的项,所有其他的项都只有一个父节点


二叉树


这里有两种极端情况:

(1)分叉状,带有N个节点并且高度为N-1

这样的树类似于链表列表中的一个线性链,因此,在这种结构中,访问、插入或删除一个节点,最坏情况下的时间代价都是线性的。

(2)满二叉树,包含了给定高度H下的最大数目的节点

现在我们来计算下,一个高度为H的满二叉树包含的节点数目N是多少?

N = 1 + 2 + ... + 2H = 2^(H+1) - 1

那么也可以求得包含N个节点的满二叉树的高度H:

H = log2(N+1) - 1

由于在从根节点到一个叶子节点的给定路径上,节点的数目接近于log2(N),如果要访问一个满二叉树上的一个给定的节点的话,所需的最大工作量为O(logN)

一般来说,二叉树越平衡,访问、插入和删除的性能也就会越高。

完美二叉树(满二叉树)、完全二叉树、完满二叉树比较

完美二叉树:一个深度为k(>=-1)且有2^(k+1) - 1个结点的二叉树称为完美二叉树。 (注: 国内的数据结构教材大多翻译为"满二叉树")


完全二叉树:完全二叉树从根结点到倒数第二层满足完美二叉树,最后一层可以不完全填充,其叶子结点都靠左对齐


完满二叉树:所有非叶子结点的度都是2。(只要你有孩子,你就必然是有两个孩子。) 




遍历二叉树

前序遍历

前序遍历算法先访问树的根节点,然后以类似的方式分别遍历左子树和右子树。


中序遍历

中序遍历的算法先遍历左子树,然后访问根节点,最后遍历右子树,这个算法先尽量移动到树的最左边,然后才开始访问节点。


后序遍历

后续遍历算法会先遍历左子树,然后是右子树,最后访问根节点。


层序遍历

层序遍历算法会首先从0层级开始,在每一个层级按照从左向右的顺序访问节点。




二叉搜索树

二叉搜索树(BST)在其节点上施加了一种排序的顺序。在一个BST中,给定节点的左子树中的节点要小于它,其右子树中的节点要大于给定的节点。

由于列表是有序的,搜索算法在每一

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
搜索(Binary Search Tree,简称BST)是一种特殊的二结构,它的每个节点都包含一个键值,并且具备以下性质: 1. 左子中的所有节点的键值小于根节点的键值。 2. 右子中的所有节点的键值大于根节点的键值。 3. 左子和右子也分别为二搜索。 通过这样的性质,二搜索可以进行高效的查找、插入和删除操作。 在Python中,你可以使用类来实现二搜索。下面是一个简单的示例: ```python class TreeNode: def __init__(self, key): self.key = key self.left = None self.right = None class BST: def __init__(self): self.root = None def insert(self, key): if self.root is None: self.root = TreeNode(key) else: self._insert_recursive(self.root, key) def _insert_recursive(self, node, key): if key < node.key: if node.left is None: node.left = TreeNode(key) else: self._insert_recursive(node.left, key) else: if node.right is None: node.right = TreeNode(key) else: self._insert_recursive(node.right, key) def search(self, key): return self._search_recursive(self.root, key) def _search_recursive(self, node, key): if node is None or node.key == key: return node if key < node.key: return self._search_recursive(node.left, key) else: return self._search_recursive(node.right, key) def delete(self, key): self.root = self._delete_recursive(self.root, key) def _delete_recursive(self, node, key): if node is None: return node if key < node.key: node.left = self._delete_recursive(node.left, key)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值