中根遍历二叉查找树所得序列一定是有序序列_二叉搜索树(BST)

二叉搜索树(BST)是一种提高查找性能的数据结构,其特点是左子树所有节点值小于根节点,右子树所有节点值大于或等于根节点。中序遍历BST可得有序序列。本文介绍了BST的插入、遍历、查找、删除操作,以及删除操作的逻辑分析,包括删除叶子节点、单子树节点和拥有左右子树的节点。
摘要由CSDN通过智能技术生成
点击上方“蓝字”,发现更多精彩。

前面我们介绍了树的基本概念,并引出了二叉树。值得注意的是,无特征的二叉树在工程上几乎没啥用处,一般都是使用bst、avl,trie,rbtree等具有特殊特征的二叉树。

下面,我们先来看一看二叉搜索树。

BST(Binary Search Tree,二叉搜索树)可以提高查找的性能,二叉搜索树相比于其他数据结构的优势在于查找、插入的时间复杂度较低,平均为O(log n),最差为O(n),此时相当于二叉搜索树变成了链表。从这一个特点我们应该不难发现,树,是链表和数组之间的一种平衡,为了获得更好性能的查找、插入和删除方法。

BST的特点是:

1.若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;

2.若任意节点的右子树不空,则右子树上所有节点的值均大于或等于它的根节点的值;

3.任意节点的左、右子树也分别为二叉查找树; 

中序遍历二叉查找树可得到一个关键字的有序序列,一个无序序列可以通过建构一棵二叉查找树变成一个有序序列,建构树的过程即为对无序序列进行查找的过程。每次插入的新的结点都是二叉查找树上新的叶子结点(作为叶子节点插入),在进行插入操作时,不必移动其它结点,只需改动某个结点的指针,由空变为非空即可。

如图1-1所示,即为一颗二叉搜索树:

6b4f072beed86c7e7f13c23f142427a5.png

写在前面:注意,此时我们实现的二叉搜索树,不考虑有关键字相同的情况,即不考虑不同节点的数据元素相同时的场景,这就好比加减乘除没有学会之前,我们不考虑微积分怎么求解。在前面的文章中,我们手动使用指针搭建了一个树形结构,目的是为了演示二叉树的先序,中序和后序遍历。在今天这篇文章中,我们将实现BST的插入,删除和查找工作。为了搭建出一颗二叉搜索树,那我们先实现插入函数。

基本数据定义:

fc9396c97de8a4e1e96ace0101f87fdd.png

有一个BST根节点中节点初始化的宏,用于初始化根节点。还是使用Linux内核设计者们的设计思路,如同内核链表的基本套路一样,但是,插入操作的函数接口如何定义是一个值得思考的问题。插入,可以按照值插入,也可以按照节点插入。下面我们演示节点插入的方式,值插入读者可以当做练习自行实现。API:
struct crystal_bst_tree {
        struct bst_node my_node;    int num;};int bst_insert(struct bst_root *root, struct crystal_bst_tree *tree)int bst_insert(struct bst_root *root, struct bst_node *tree)

bst_insert函数有两个参数,第一个是根节点,第二个是需要插入的节点,插入节点的定义,可以使用struct crystal_bst_tree *也可以使用struct bst_node *。这两种类型的差别无非是是否需要使用container_of宏处理而已。按照Linux内核设计者们的惯例,我们使用后者,来实现插入操作:

static inline void bst_link_node(struct bst_node * node, struct bst_node * parent,        struct bst_node ** bst_link){
      node->bst_left = node->bst_ri
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值