首页 > 其他分享 >二叉查找树

二叉查找树

时间:2024-01-23 09:33:05浏览次数:27  
标签:return val ll tree 二叉 查找 next

二叉查找树是类似于一种堆的数据结构(没有重复元素)

二叉查找有一个性质:中序遍历得到的就是关键码升序排列的序列

这个结构支持很多的操作

  • insert(int val):新增一个关键码为val的节点
  • get(int val):查找关键码为val的节点
  • getnext(int val):查找val的前驱(严格大于val的最小值,可能vall不在树中)
  • getpre(int val):查找val的后继(严格小于val的最大值,可能val不在树中)
  • remove(int val):删除关键码为val的节点
  • getrank(int val):查找val的排名
  • getkth(int k):查找排名为k的val

定义一个二叉查找树

 

struct node{
    ll l,r,val;
}tree[100010];
ll tot,root;
ll newnode(ll val){//新建一个节点
    tree[++tot].val=val;
    return tot;
}void build(){//初始化,建树
    newnode(~0x3f3f3f3f);
    newnode(0x3f3f3f3f);
    root=1;
    tree[1].r=2;
}

 

查找关键码为val的节点

//在以tree[p]为根的子树中查找val,主函数调用get(root,val);
ll get(ll p,ll val){//节点编号,关键码
    if(p==0) return 0;
    if(tree[p].val==val) return p;
    else if(tree[p].val>val) return get(tree[p].l,val);
    else return get(tree[p].r,val);
}

新增一个关键码为val的节点

//在以tree[p]为根的子树中查入val,主函数调用insert(root,val);
void insert(ll & p,ll val){
    if(p==0) {
        p=newnode(val);
        return ;
    }
    if(tree[p].val==val) return ;
    else if(tree[p].val>val) insert(tree[p].l,val);
    else insert(tree[p].r,val);
}

查找最小和最大的节点

ll getmin(ll p){
    if(tree[p].l==0) return p;
    return getmin(tree[p].l);
}ll getmax(ll p){
    if(tree[p].r==0) return p;
    return getmax(tree[p].r);
}

查找后继节点

ll getnext(ll val){
    ll p=root,ans=2;
    while(p!=0){
        if(tree[p].val==val){
            if(tree[p].r!=0){
                p=tree[p].r;
                while(tree[p].l!=0) p=tree[p].l;
                return 0;
            }break;
        }if(tree[p].val>val&&tree[p].val<tree[ans].val) ans=p;
        if(tree[p].val>val) p=tree[p].l;
        else p=tree[p].r;
    }return ans;
}

删除节点

void remove(ll & p,ll val){
    if(p==0) return ;
    if(val==tree[p].val){
        if(tree[p].l==0) p=tree[p].r;
        else if(tree[p].r==0) p=tree[p].l;
        else{
            ll next=tree[p].r;
            while(tree[next].l>0) next=tree[next].l;
            remove(tree[p].r,tree[next].val);
            tree[next].l=tree[p].l;
            tree[next].r=tree[p].r;
            p=next;
        }return ;
    }if(val<tree[p].val) remove(tree[p].l,val);
    else remove(tree[p].r,val);
}

 

标签:return,val,ll,tree,二叉,查找,next
From: https://www.cnblogs.com/lutaoquan/p/17981653

相关文章

  • 算法学习Day41整数拆分、不同的二叉搜索树
    Day41整数拆分、不同的二叉搜索树ByHQWQF2024/01/22笔记343.整数拆分给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。返回你可以获得的最大乘积。示例1:输入:2输出:1解释:2=1+1,1×1=1。示例 2:输入:10输出:36解释......
  • 二分查找
    二分查找一、应用场景​ 一个很常见的情景:猜数——猜大了就小一点,猜小了就大一点。我们在这个例子中发现,不停的缩小范围,舍弃(更贴切的说法是“排除”)不必要的搜查范围,这样有利于我们去快速查找。​ 这种二分思想,我们也可应用到其他方面:比如开平方数之类——不停的从目标区间的......
  • KY85 二叉树C++
    递归判断当前节点和n的关系就好了。如果小于等于n那就是存在。#include<iostream>usingnamespacestd;intcount(inti,intn){if(i>n)return0;returncount(2*i,n)+count(2*i+1,n)+1;}intmain(){intn,m;while(cin>>m>>n){if(n==0)......
  • 遍历二叉树非递归实现
    实现1.前序遍历publicvoidpreOrderNor(TreeNoderoot){if(root==null){return;}Stack<TreeNode>stack=newStack<>();stack.push(root);while(!stack.isEmpty()){TreeNodecur......
  • js用前缀名查找class或id节点,js模糊查询某个dom节点
     1//参数dom为htmldom节点2//参数key为需模糊查询的名称字段3functionqueryClassNode(dom,key){4letcollectArray=[];5for(leti=0;i<dom.childNodes.length;i++){6//核心点7if(d......
  • Visual Studio实用的搜索、查找、替换技巧
    前言对于.NET开发者而言VisualStudio是我们日常工作中比较常用的开发工具,掌握一些VisualStudio实用的搜索、查找、替换技巧可以帮助我们大大提高工作效率从而避免996。VisualStudio更多实用技巧https://github.com/YSGStudyHards/DotNetGuide代码和功能搜索(Ctrl+T)Ctr......
  • 【LeetCode】704. 二分查找
    题目:704.二分查找解题思路思路:给定一个nums数组,注意数组是升序排列的;那么,找到当前target元素是否存在于数组之中,可采用二分法查找注意:此处定义该数组区间定义:【左闭右闭】/【左闭右开】使用left指向数组头,right指针指向数组尾,mid用于计算二分查找的位置,mid=left+(ri......
  • 使用find命令查找文件
    要查找一个ssl.h的文件 find/-namessl.h2>/dev2/null使用root权限,从根目录下查找 ssl.h文件将错误日志重定向到 /dev2文件夹下面的null文件如果dev2文件夹不存在,需要手动创建/usr/include/openssl/ssl.h  扩展说明:在Unix/Linux系统中,>和2>分别......
  • 二叉树面试题进阶
    二叉树面试题进阶1.二维数组存储层序遍历结果难点: 如何存储每一层的节点?根据队列节点的个数判断每一层classSolution{publicList<List<Integer>>levelOrder(TreeNoderoot){List<List<Integer>>retList=newArrayList<>();if(root==nu......
  • 实现创建二叉树
    创建二叉树1.前序遍历创建二叉树importjava.util.Scanner;//注意类名必须为Main,不要有任何packagexxx信息classTreeNode{publicTreeNodeleft;publiccharval;publicTreeNoderight;publicTreeNode(charval){this.val=......