说实话,算法导论上讲的那个节点插入算法写得不太专业,虽然让人一看就感觉懂了,但正真实现起来才发现根本不是那回事(当然变换过程是一样的,但不像算法里写的那样用结构体来完成)。经过我自己一本不正经的摸索和大佬们的指点迷津,终于用数组实现了二叉搜索树的构造呵呵哈哈哈~
交换过程可以参考算法导论以及网易公开课算法导论。
- 算法描述
不知何为二叉搜索的童鞋请先百科。对于数组A[ ],令A[1]为根节点,每输入一个A[ i ],首先与根节点比较,大于根节点则放在根节点右边,若根节点没有右子节点,则令A[ i ]为右子节点,否则与右子节点比较;若A[ i ] 小于根节点,根节点没有左子节点,则令A[ i ]为左子节点,否则与左子节点比较;。。。。以此类推最终得到二叉搜索树。 - 二叉搜索树的特点
二叉搜索树不会丢失输入序列的原有顺序。在工程中不会丢失原有特征;
二叉搜索树的比较过程和快排的过程本质没有任何区别,所以构建二叉搜索树的复杂度与快排复杂度相等。
高度为n的二叉搜索树的查询复杂度为线性时间n,这也是二叉搜索树作为工程应用的基础。 - 随机化的构造是指在构造二叉树之前先打乱原有数组,随机化过程会得到更均匀的结果,但是会丢失原有的输入顺序
读本代码需要注意的地方
- 输入:一串用空格隔开,不知长度和大小的数字。结束输入:换行,CTRL+Z
输出:1.打乱后后的序列 2.dfs建立的二叉搜索树所得到的中序遍历,应为顺序。 由于输入数据的数量未可知,所以借用了队列来帮助建立初始化数组KEY。
由于用到了数组传递,要求指针内存必须连续,所以所有的数组均以malloc函数申请空间内存。
- memset函数不是填值函数,fill函数才是填值函数,所以要将数组的元素初始化为某值的时候请用fill函数。
7.算法随机过程只是模拟随机,并非正真随机,所以每一次重新调用相同的处理,结果都会相同