二叉搜索树(排序二叉树)

完整代码:插入,查找,删除

struct BST {
    int val;
    BST *lch, *rch;
    BST *insert(BST *p, int x) {
        if (p == NULL)  {
            BST *t = new BST;				//new出来的不是指向NULL的
            t->val = x;
            t->lch = t->rch = NULL;
            return t;
        }
        if (x <= p->val)    p->lch = insert (p->lch, x);
        else    p->rch = insert (p->rch, x);
        return p;
    }
    bool find(BST *p, int x)   {
        if (x == p->val)    return true;
        else if (p == NULL) return false;
        else if (x <= p->val)    {
            return find (p->lch, x);
        }
        else    {
            return find (p->rch, x);
        }
    }
    BST *remove(BST *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);
        else if (p->lch == NULL)    {		//如果需要删除的结点没有左儿子,那么把右儿子提上去
            BST *t = p->rch;
            delete p;
            return t;
        }
        else if (p->lch->rch == NULL)   {	//如果需要删除的结点的左儿子没有右儿子,那么把左儿子提上去
            BST *t = p->lch;
            t->rch = p->rch;
            delete p;
            return t;
        }
        else    {							//以上两种情况不满足,把左儿子子孙中值最大的结点提上去
            BST *t = p->lch;
            while (t->rch->rch != NULL) t = t->rch;
            BST *r = t->rch;
            t->rch = r->lch;
            r->lch = p->lch;
            r->rch = p->rch;
            delete p;
            return r;
        }
        return p;
    }
}bst;

  

时间: 2024-08-09 06:17:14

二叉搜索树(排序二叉树)的相关文章

树&#183;二叉查找树ADT(二叉搜索树/排序树)

1.定义 对于每个节点X,它的左子树中所有的项的值小于X的值,右子树所有项的值大于X的值. 如图:任意一个节点,都满足定义,其左子树的所有值小于它,右子树的所有值大于它. 2.平均深度 在大O模型中,二叉查找树的平均深度是O(logN) . 证明:查找某个节点x的算法深度,即从根出发找到节点x的路径长.所有查找的平均深度,就是平均内部路径长. 假设二叉查找树共N个节点,假设左子树有i个节点,则右子树节点数目:N-i-1. 假设D(N)表示具有N个基点的内部路径长.则N个节点的树的内部路径长:D(

平衡二叉搜索树/AVL二叉树 C实现

//AVTree.h 1 #ifndef MY_AVLTREE_H 2 #define MY_AVLTREE_H 3 typedef int ElementType; 4 struct TreeNode 5 { 6 ElementType data; 7 struct TreeNode *left; 8 struct TreeNode *right; 9 int height; 10 }; 11 typedef struct TreeNode TreeNode; 12 typedef TreeN

二叉搜索树的根插入、选择、删除、合并、排序等操作的实现

源代码如下: 这里的Key 不当为关键字对待, 而是把Item.c作为关键字对待 #include <stdlib.h> #include <stdio.h> //#define Key int typedef int Key; struct Item{ Key key; char c; }; typedef struct STnode* link; struct STnode{ Item item ; link l,r; int N; }; static link head ,

二叉搜索树(Binary Search Tree)--C语言描述(转)

图解二叉搜索树概念 二叉树呢,其实就是链表的一个二维形式,而二叉搜索树,就是一种特殊的二叉树,这种二叉树有个特点:对任意节点而言,左孩子(当然了,存在的话)的值总是小于本身,而右孩子(存在的话)的值总是大于本身. 下面来介绍在此种二叉树结构上的查找,插入,删除算法思路. 查找:因为这种结构就是为了来方便查找的,所以查找其中的某个值很容易,从根开始,小的往左找,大的往右找,不大不小的就是这个节点了: 代码很简单,这里就不写了. 插入:插入一样的道理,从根开始,小的往左,大的往右,直到叶子,就插入.

二叉搜索树的随机化插入和伸展插入操作(平摊法)

源码例如以下: #include <stdlib.h> #include <stdio.h> //#define Key int #define hl h->l #define hr h->r #define hlr h->l->r #define hll h->l->l #define hrr h->r->r #define hrl h->r->l typedef int Key; struct Item{ Key ke

二叉搜索树(Binary Search Tree)--C语言描述

一:硬着头皮就是上 数据结构中有个东西一直不愿意去面对,就是二叉搜索树,以及平衡二叉树.想想就耗脑细胞 马上开学了,就要学C++了,还有其他的事,估计更没有时间搞数据结构了,于是狠下心,把二叉搜索树和平衡二叉树给拿下!! 啊啊啊啊,算法很枯燥无聊,不过搞明白了收获多多,不过目前好像没有什么用. 反正安慰自己,这都是内功,修炼好了,以后放大招威力无比啊,嘿嘿. 二:图解二叉搜索树概念 二叉树呢,其实就是链表的一个二维形式,而二叉搜索树,就是一种特殊的二叉树,这种二叉树有个特点:对任意节点而言,左孩

输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表。

一.问题描述 输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表.而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现. 二.实现思路 在二叉搜索树中,每个结点都有两个分别指向其左.右子树的指针,左子树结点的值总是小于父结点的值,右子树结点的值总是大于父结点的值.而在双向链表中,每个结点也有两个指针,它们分别指向前一个结点和后一个结点.所以这两种数据结构的结点是一致,二叉搜索树之所以为二叉搜索树,双向链表之所以为双向链表,只是因为两个指针的指向不同而已 思路

数据结构(三):非线性逻辑结构-特殊的二叉树结构:堆、哈夫曼树、二叉搜索树、平衡二叉搜索树、红黑树、线索二叉树

在上一篇数据结构的博文<数据结构(三):非线性逻辑结构-二叉树>中已经对二叉树的概念.遍历等基本的概念和操作进行了介绍.本篇博文主要介绍几个特殊的二叉树,堆.哈夫曼树.二叉搜索树.平衡二叉搜索树.红黑树.线索二叉树,它们在解决实际问题中有着非常重要的应用.本文主要从概念和一些基本操作上进行分类和总结. 一.概念总揽 (1) 堆 堆(heap order)是一种特殊的表,如果将它看做是一颗完全二叉树的层次序列,那么它具有如下的性质:每个节点的值都不大于其孩子的值,或每个节点的值都不小于其孩子的值

二叉树、二叉搜索树、AVL树的java实现

数据结构一直都是断断续续的看,总是觉得理解的不够深入,特别是对树的理解,一直都很浅显,今儿又看了一遍,来做个总结吧. 首先,树中的一些概念: 1.树的节点包含一个数据元素,以及若干指向其子树的分支.节点拥有的子树的数量称为节点的度.节点的最大层次称为树的深度或高度. 2.二叉树是一种树形结构,其特点是每个节点至多有两棵子树,且子树有左右之分,次序不能随意颠倒. 3.满二叉树:一棵深度为k且有2^k - 1个节点的二叉树,称之为满二叉树. 4.完全二叉树:对一个深度为k,节点个数为n的二叉树,当且