二叉搜索树(Binary Search Tree)

1、什么是二叉搜索树

       二叉搜索树(Binary Search Tree)是一棵有序的二叉树,所以我们也可以称它为二叉排序树(不知道二叉树的童鞋,先看看二叉树:传送门)。具有以下性质的二叉树我们称之为二叉搜索树:若它的左子树不为空,那么左子树上的所有值均小于它的根节点;若它的右子树不为空,那么右子树上所有值均大于它的根节点。它的左子树和右子树分别也为二叉搜索树。

2、二叉搜索树的结构

      二叉搜索树能够高效的进行一下操作:①插入一个数值②查询是否包含某个数值③删除某个数值

     根据实现的不同,还可以实现其他各种操作,这是一种使用性很高的数据结构。我们来看一个例子:

        这就是二叉搜索树的存储结构,所有的节点,都满足左子树上的比自己小,而右子树上的所有节点比自己大。二叉搜索树因为其有序性,所以它能够高效的管理数的集合 

(1)查询

       我们查找是否存在17:

        <1>根节点是7,因为小于17,所以去右子树查找

        <2>走到节点12,还是小于17,所以继续往右子树找

        <3> 走到节点17,此时找到17。

(2)插入

       我们使用查找的方式进行插入,以数字6为例,如图所示:

(3)删除

       删除操作相对之前的其他两种操作,就略显复杂一些。一般来说我们可以分为三种情况:

       <1>需要删除的节点没有左儿子,那么就把右儿子提上去

       <2>需要删除的节点的左儿子没有右儿子,那么就把左儿子提上去

       <3>不满足上述的两种情况的话,就把左子树中最大的节点放到要删除的节点上。

     

3、二叉搜索树的复杂度

      无论我们执行哪一个操作,其所花的时间都和树的高度成正比。我们不难得知,二叉搜索树的平均复杂度为O(log n)。

4、二叉搜索树的实现

       通过上述的了解,我们大致已经知道二叉搜索树的工作原理。所以现在我们就来简单的实现二叉搜索树基本的增删查的功能,代码如下:

//表示节点的结构体
struct node{
    int val;
    node *lch, *rch;
};
//插入整数x
node *insert(node *p, int x){
    if(p == NULL){
        node *newNode = new node;
        newNode->val = x;
        newNode->lch = newNode->rch = NULL;
        p = newNode;
    }else{
        if(x < p->val) p->lch = insert(p->lch, x);
        else p->rch = insert(p->rch, x);
    }
    return p;
}
//查找整数x
bool find(node *p, int x){
    if(p == NULL) return false;
    else if(p->val == x) return true;
    else if(p->val > x) return find(p->lch, x);
    else return find(p->rch, x);
}
//删除整数x
node *remove(node *p, int x){
    if(p == NULL) return NULL;
    else if(x < p->val) p->lch = remove(p->lch, x);
    else if(x > p->val) p->rch = remove(p->rch, x);
    //情况<1>
    else if(p->lch == NULL){
        node *q = p->rch;
        delete p;
        return q;
    }
    //情况<2>
    else if(p->lch->rch == NULL){
        node *q = p->lch;
        q->rch = p->rch;
        delete p;
        return q;
    }
    //情况<3>
    else {
        node *q;
        for(q = p->lch; q->rch->rch != NULL; q = q->rch);
        node *r = q->rch;
        q->rch = r->lch;
        r->lch = p->lch;
        r->rch = p->rch;
        delete p;
        return r;
    }
    return p;
}

 


  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 二搜索Binary Search Tree):是一棵空或者具有下列性质的二:若它的左子不空,则左子上所有节点的值均小于它的根节点的值;若它的右子不空,则右子上所有节点的值均大于它的根节点的值;它的左右子也分别为二搜索。 中序遍历序列:对于任意一棵二,中序遍历的结果都是一个序列,这个序列称为中序遍历序列。 因此,判断一棵二是否为二搜索,可以先进行中序遍历,再判断遍历结果是否为升序序列。 以下是 Python 代码实现: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def inorderTraversal(root: TreeNode) -> List[int]: res = [] if not root: return res res.extend(inorderTraversal(root.left)) res.append(root.val) res.extend(inorderTraversal(root.right)) return res def isBST(root: TreeNode) -> bool: res = inorderTraversal(root) for i in range(1, len(res)): if res[i] <= res[i-1]: return False return True ``` 其中,`TreeNode` 是二的节点类,`inorderTraversal` 函数是实现二中序遍历的递归函数,`isBST` 函数是判断二是否为二搜索的函数。 ### 回答2: 要实现这个函数,首先我们可以使用递归的方式对二进行中序遍历,即先遍历左子,再访问根节点,最后遍历右子。遍历过程中将遍历到的节点值保存到一个数组中。 接下来,我们需要判断该数组是否是按升序排列的,即判断是否是一棵二搜索。我们可以遍历数组,依次比较相邻的节点值,如果前一个节点的值大于等于后一个节点的值,则认为不是二搜索。反之,如果整个数组都符合这个条件,则认为是一个二搜索。 以下是一个简单的实现代码: ``` class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def inorderTraversal(root): if not root: return [] result = [] inorder(root, result) return result def inorder(root, result): if not root: return inorder(root.left, result) result.append(root.val) inorder(root.right, result) def isBST(root): inorder_result = inorderTraversal(root) for i in range(1, len(inorder_result)): if inorder_result[i] <= inorder_result[i-1]: return False return True ``` 这个函数的时间复杂度是O(n),其中n是二中节点的数量,因为我们需要遍历每个节点并将节点的值保存到数组中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值