前段时间去面试,不是算法就是源码,被问到崩溃,这是今年程序员多了,还是要求高了。算法还好吧,状态好还能写两个简单的,源码说实话我都不主动去看了,都是系统出问题了我再来以这个为切入点去看看。面试机会很多,但结果都是等通知或者薪资压榨太多,不上班就不上班把,再怎么也不能走倒退路。
哪里不会就学哪里吧,没有撤退可言。
查找二叉树的定义:所有的左子树都比节点小,所有的右子树都比节点大。(数据结构与算法分析上定义的,其实反过来定义也可以吧,左子树大右子树小)
示例图:
可以看到查找二叉树天然有序,查找某个元素,如果比节点大就往左,如果比节点小就往右。如果查找二叉树分布的好(标注1),它的查找时间是O(logN)。我们采用中序遍历它,直接可以得到一个从小到大排序的数组。
适用场景:它的综合性能很强,不论是查找,插入,删除都有很不错的性能。
标注1的解释:什么叫查找二叉树分布的好,我先讲一个最差的查找二叉树情形。如果一个按从小到大的数组转成查找二叉树会怎么样,是不是查找二叉树只有右子树这一边,其实它就成了一个链表。那么它的最坏查找时间就是O(N),但一般情况下,这个速度也是很快了,它的插入性能还不如普通的链表了。所以最好的查找二叉树就是要求趋向于完全二叉树。树的最高高度越低,它的查找就越快。
普通查找二叉树的进阶:普通的查找二叉树是很难做到分布完全,所以平衡查找二叉树应用而生。普通查找二叉树通过单旋转或双旋转操作变成平衡查找二叉树(元素分布完全,形状趋向于完全二叉树)
我用java语言来实现了一下普通的查找二叉树,增删查都有。
展望:我想内部实现一个Iterator迭代器的,方便遍历查询。但是没有想出树只遍历一遍,就迭代完成的算法。如果是两遍的话,我实现了toArray()树转数组的方法,然后数组再遍历,有思路的朋友可以分享一下。
package com.tczs.tree;
import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.Arrays;
/**
* 普通的查找二叉树
* @param <T>
* @author taoer.li
* @date 2020.10.06
*/
public class BinarySearchTree<T extends Comparable<T>> implements Serializable{
private int length;
private BinaryNode root;
private transie