【JAVA/读书随笔】Chapter 26 二叉查找树(BST)

13 篇文章 0 订阅

二叉查找树(Binary Search Tree, BST)

二叉查找树的重要特点是:左子树一定不大于父结点,右子树一定比父结点大,所以可以将搜索时间复杂度控制在 log n 的水平上。

1. 表示 BST


定义结点:

class TreeNode<E> {
  E element;
  TreeNode<E> left;
  TreeNode<E> right;
  
  public TreeNode(E e) {
    element = e;
  }
}

2. 查找 BST

参考 BST 的重要特点,依照大小的模式寻找:

    若待搜索元素小于结点,搜索左子树;

    若待搜索元素大于结点,搜索右子树;

    若待搜索元素等于结点,返回true;


3. 插入一个元素


在 BST 中插入一个元素,关键在于确定在树中插入元素的位置,思路是确定新结点的父结点所在的位置。可以借助 2 中查找 BST 的方式找到插入位置。


4. 遍历(traverse)

BST 的遍历是很重要的操作,主要应用的就是迭代方法。以下是五种常用的遍历模式。


中序遍历(inorder)                  左——》中——》右

先遍历左子树,接下来是父结点,然后是右子树。特点是 以递增顺序显示一个 BST 中所有结点。

前序遍历(preorder)              中——》左——》右

先遍历父结点,接下来是左子树,最后是右子树。典型应用是打印结构文档。

后序遍历(postorder)            左——》右——》中

先遍历左子树,接下来右子树,最后是父结点。典型应用是找出目录中文档的个数,在找出根目录的大小之前得到每个子目录的大小。

广度优先遍历(breadth-first)
广度优先遍历方法逐层方位树中的结点。首先访问根节点,然后从左往右访问根结点的所有孩子,再从左往右访问根结点的所有孙子结点。
深度优先遍历(depth-first)


5. 删除 BST 中的一个元素

为了从一个 BST 中删除一个元素,我们需要定位该元素所在位置和它的父结点位置。假设 current 指向二叉查找树中包含该元素的结点,而 parent 指向 current 结点的父结点。 current 结点可能是 parent 结点的左孩子,也可能是右孩子。这里需要考虑下面两种情况:

1. 若 current 结点没有左孩子,这时需要将该结点的父结点和当前结点的右孩子相连。

2. 若 current 结点有一个左孩子,那么假设 rightMost 指向 current 左子树中的最大元素,该元素的父结点是 parentOfRightMost ,那么我们要做的就是用 rightMost 元素替换 current 元素,将 parentOfRightMost 与 rightMost 的左子树相连。


6. 迭代器

利用之前的各种遍历模式+java.util.Iterator 接口,我们可以定义自己的迭代器,注意,java.util.Iterator 接口定义了三个函数:

1. +hasNext(): boolean

2. +next(): Object

3. +remove(): void


7. 数据压缩:哈夫曼编码(Huffman Coding Tree)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值