二叉查找树BST 模板

二叉查找树BST 就是二叉搜索树 二叉排序树。

就是满足 左儿子<父节点<右儿子 的一颗树,插入和查询复杂度最好情况都是logN的,写起来很简单。

根据BST的性质可以很好的解决这些东西

1.查询值

int Search(int k,int x)
{
    if(x<a[k].key && a[k].l) Search(a[k].l,x);
    else if(x>a[k].key && a[k].r) Search(a[k].r,x);
    else return k;
}

2.查询最小值最大值

int getmin(int k)
{
    if(!a[k].l)return k;
    return getmin(a[k].l);
}
int getmax(int k)
{
    if(!a[k].r)return k;
    return getmax(a[k].r);
}

3.输出排序(其实就是中根遍历)

void Leftorder(int k)
{
    if(a[k].l)Leftorder(a[k].l);
    printf("%d ",a[k].key);
    if(a[k].r)Leftorder(a[k].r);
}

接下来说一下BST的操作

1.插入

这个没什么好说的,就是小的插右边 大的插左边 递归下去就行了。

void InsertNode(int k,int x)
{
    if(tree_size==0)root=++tree_size,a[root].key=x;
    else if(x<=a[k].key){
        if(a[k].l)InsertNode(a[k].l,x);
        else{
            tree_size++;
            a[tree_size].key=x;
            a[tree_size].p=k;
            a[k].l=tree_size;
        }
    }
    else if(x>a[k].key){
        if(a[k].r)InsertNode(a[k].r,x);
        else{
            tree_size++;
            a[tree_size].key=x;
            a[tree_size].p=k;
            a[k].r=tree_size;
        }
    }
}

2.删除

对于删除点的操作,分下面三种情况:

  (1)删的这个点没有左儿子  ->   让它的右子树代替它

  (2)删的这个点没有右儿子  ->   让它的左子树代替它

  (3)删的这个点子孙齐全   ->   在它的的左子树里选一个最小的(或者在右子树里找一个最大的)放在它的位置,好理解吧

}
void Treeplant(int k,int x,int y)          //用子树y代替x
{
    if(x==root)root=y;
    else if(x==a[a[x].p].l)a[a[x].p].l=y;
    else a[a[x].p].r=y;
    if(a[y].key)a[y].p=a[x].p;
}
void DeleteNode(int k,int x)
{
    if(!a[x].l)Treeplant(k,x,a[x].r);        //情况一
    else if(!a[x].r)Treeplant(k,x,a[x].l);     //情况二
    else{                         //情况三
        int y=getmin(a[x].r);
        if(a[y].p!=x)
        {
            Treeplant(1,y,a[y].r);
            a[y].r=a[x].r,a[a[y].r].p=y;
        }
        Treeplant(1,x,y);
        a[y].l=a[x].l,a[a[y].l].p=y;
    }
}

这点东西都跟算法导论学的 , 很好理解 ,就扯这么多了 ,立个flag明天写Splay

时间: 2024-10-05 23:46:26

二叉查找树BST 模板的相关文章

二叉查找树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree)的比较

http://www.iteye.com/topic/614070 此少侠总结的特棒,直接收藏了. 我们这个专题介绍的动态查找树主要有: 二叉查找树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree).这四种树都具备下面几个优势: (1) 都是动态结构.在删除,插入操作的时候,都不需要彻底重建原始的索引树.最多就是执行一定量的旋转,变色操作来有限的改变树的形态.而这些操作所付出的代价都远远小于重建一棵树.这一优势在<查找结构专题(1):静态查找结构概论 >中讲到

详解二叉查找树(BST)

详解二叉查找树(BST) 本篇随笔简单讲解一下数据结构--二叉查找树(\(Binary\,\,Sort\,\,Tree,BST\)),(后文的"二叉查找树"一词均用\(BST\)代替). BST的概念 首先,\(BST\)是一棵二叉树. 它的定义是,根节点左子树全部严格小于根节点,右子树大于等于根节点,并且,左右子树都是\(BST\). 很好理解,很明朗很简单的定义. 可以看出,这是一个通过递归方式定义的数据结构,所以,它的诸多操作自然要用到递归. BST的功能 我们可以看出来,这个二

【查找结构 2】二叉查找树 [BST]

当所有的静态查找结构添加和删除一个数据的时候,整个结构都需要重建.这对于常常需要在查找过程中动态改变数据而言,是灾难性的.因此人们就必须去寻找高效的动态查找结构,我们在这讨论一个非常常用的动态查找树——二叉查找树 . 二叉查找树的特点 下面的图就是两棵二叉查找树,我们可以总结一下他的特点: (1) 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值 (2) 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值(3) 它的左.右子树也分别为二叉查找树 我们中序遍历这两棵树发现一个

二叉查找树(BST树)

二叉查找树的特点: 在二叉查找树中左子树上所有结点的数据都小于等于根结点的数据,而右子树上所有结点的数据都大于根结点的数据 1 //存储结构: 2 struct node 3 { 4 Int data; 5 node *lchild; 6 node *rchild; 7 }; 8 9 //在建树前根节点不存在: 10 Node *root = NULL; 11 12 //新建结点: 13 node *newNode(int v) 14 { 15 node *Node = new node; 16

程序员修炼之路-(4)搜索(中):二叉查找树

2 查找:鱼与熊掌 前面已经介绍了线程查找和二分查找的符号表(symbol table)实现,但现代应用的特点是查找与插入或删除操作交叉在一起,无法预测,并且表非常巨大.因此问题的关键就是我们能否设计出具有对数性能的search和insert/delete操作的数据结构和算法?为了实现高效的插入,我们需要链表结构.但是单链表却又阻止了二分查找的使用,因为二分查找依赖数组的快速访问才能快速定位到每次迭代的中间元素."为了结合二分查找的高效和链表结构的灵活性,我们需要更加复杂的数据结构,这就是接下来

算法——dfs 判断是否为BST

95. 验证二叉查找树 中文English 给定一个二叉树,判断它是否是合法的二叉查找树(BST) 一棵BST定义为: 节点的左子树中的值要严格小于该节点的值. 节点的右子树中的值要严格大于该节点的值. 左右子树也必须是二叉查找树. 一个节点的树也是二叉查找树. Example 样例 1: 输入:{-1} 输出:true 解释: 二叉树如下(仅有一个节点): -1 这是二叉查找树. 样例 2: 输入:{2,1,4,#,#,3,5} 输出:true 解释: 二叉树如下: 2 / 1 4 / 3 5

算法系列笔记3(二叉查找树)

(1)二叉查找树的性质:设x为二叉查找树的一个结点.如果y是x左子树中的一个结点,则key[y]≤key[x].如果y是x的右子树中的一个结点.则key[x]≤key[y]. (2)二叉查找树的结点中除了key域和卫星数据外,还包括left.right和p分别指向结点的左儿子.右儿子和父节点. (3)构造一棵二叉查找树最好情况下时间复杂度为O(nlgn),最坏情况为O(n^2).随机化构造一棵二叉查找树的期望时间O(nlgn).与快排和随机化快速排序算法是做相同的比较,但是顺序不一样.可以证明随

树:BST、AVL、红黑树、B树、B+树

我们这个专题介绍的动态查找树主要有: 二叉查找树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree).这四种树都具备下面几个优势: (1) 都是动态结构.在删除,插入操作的时候,都不需要彻底重建原始的索引树.最多就是执行一定量的旋转,变色操作来有限的改变树的形态.而这些操作所付出的代价都远远小于重建一棵树.这一优势在<查找结构专题(1):静态查找结构概论 >中讲到过. (2) 查找的时间复杂度大体维持在O(log(N))数量级上.可能有些结构在最差的情况下效率将

验证二叉查找树

二叉查找树 给定一个二叉树,判断它是否是合法的二叉查找树(BST) 一棵BST定义为: 节点的左子树中的值要严格小于该节点的值. 节点的右子树中的值要严格大于该节点的值. 左右子树也必须是二叉查找树. 因为二叉查找树的中序遍历是有序的.所以验证是否为二叉查找树,用中序遍历这个二叉树,如果前一个结点的值大于当前结点的值,则证明这个不是二叉树. 代码实现 bool isValidBST(TreeNode *root) { // write your code here if(root == NULL