首页 > 其他分享 >二叉搜索树的插入 查找 删除

二叉搜索树的插入 查找 删除

时间:2023-11-14 13:11:37浏览次数:35  
标签:node cur temp BinaryTreeNode 二叉 插入 leftChild 查找 NULL

//1、定义二叉搜索树类,封装查找、插入、删除操作 删除最为麻烦,其中对于parent的保存用循环来记录 while的条件需多加考虑 #include<queue> #include<iostream> using namespace std;
class BinaryTreeNode{     private:     int value;     BinaryTreeNode *leftChild;     BinaryTreeNode *rightChild;     public:     BinaryTreeNode(){};//默认构造函数     BinaryTreeNode(const int&ele):value(ele),leftChild(NULL),rightChild(NULL){}//给定数值构造     BinaryTreeNode(const int&ele,BinaryTreeNode*l,BinaryTreeNode*r):value(ele),leftChild(l),rightChild(r){}//构造     friend class BinarySearchTree;     void print(){cout<<"值为"<<value<<endl;}     int getvalue(){return value;};     void leftChildVal(BinaryTreeNode*node){this->leftChild=node;}//置左孩子的节点为输入节点     void rightChildVal(BinaryTreeNode*node){this->rightChild=node;}//置右孩子的节点为输入节点
    };
class BinarySearchTree { private: BinaryTreeNode*root; public: BinaryTreeNode* getRoot(){return root;} BinarySearchTree(){root=NULL;} BinarySearchTree(BinaryTreeNode*r){root=r;} BinaryTreeNode* search(BinaryTreeNode*N1,int val);//查找 参数为节点 要找的值 返回的是这个数的节点 void insert(BinaryTreeNode*N1,int value);//插入 void del(BinaryTreeNode*N1,int value);//删除 void levelOrder(BinaryTreeNode*root)//层次遍历     {         queue<BinaryTreeNode*> nodeQueue;//需要有头文件 创建以树结点指针为元素的队列         BinaryTreeNode*temp= root;         if(temp!=NULL){nodeQueue.push(temp);}//如果当前所指非空,那么入队         while(nodeQueue.empty()!=true)//当队列不为空 (空的话为true)         {          temp=nodeQueue.front();//指向头节点          cout<<temp->value<<" ";//输出值          nodeQueue.pop();//删除该节点          if(temp->leftChild!=NULL)nodeQueue.push(temp->leftChild);          if(temp->rightChild!=NULL)nodeQueue.push(temp->rightChild);         }         cout<<endl;     } };


BinaryTreeNode* BinarySearchTree::search(BinaryTreeNode*N1,int val) {     BinaryTreeNode*temp=N1;     if(temp==NULL||temp->value==val)return temp; //如果为空或者值等于,则返回temp;     BinaryTreeNode*result=NULL;         if(temp->value<val) result = search(temp->rightChild,val);//如果小于,搜索右子树         if(temp->value>val) result = search(temp->leftChild,val);//大于,搜索左子树         return result; }
void BinarySearchTree::insert(BinaryTreeNode*N1,int val)//两个指针 一个记录当前的,一个记录上一个的 {     BinaryTreeNode*cur=N1,*parent=N1;     if(cur==NULL){cur=new BinaryTreeNode(val);}     while(cur!=NULL)//     {         parent=cur;         if(cur->value>val) cur=cur->leftChild;         else if(cur->value<val) cur=cur->rightChild;     }     if(parent->value<val) parent->rightChild=new BinaryTreeNode(val);     if(parent->value>val) parent->leftChild=new BinaryTreeNode(val); }
void BinarySearchTree::del(BinaryTreeNode*N1,int val) {     if(N1==NULL) {cout<<"为空树,无法删除"<<endl;}     BinaryTreeNode*cur=N1;     BinaryTreeNode*parent=NULL;     // while(cur!=NULL)//     // {     //     parent=cur;     //     if(cur->value>val) cur=cur->leftChild;     //     else if(cur->value<val) cur=cur->rightChild;     //     else if(cur->value==val) break;     // }     while (cur != NULL && cur->value != val) {         parent = cur;         if (val < cur->value) {             cur= cur->leftChild;         } else {             cur = cur->rightChild;         }     }
    //第一种情况 找不到要删除的数     if(cur==NULL){cout<<"没有这个数,无法删除"<<val<<endl;}     //第二种情况 待删除节点为叶子节点     else if(cur->leftChild==NULL&&cur->rightChild==NULL)     {         if(parent==NULL) {root=NULL;}         else{             if(cur==parent->leftChild) parent->leftChild=NULL;             else parent->rightChild=NULL;         }     }     //第三种情况 待删除节点只有左子树     else if(cur->leftChild&&cur->rightChild==NULL)     {         if(cur==parent->leftChild) parent->leftChild=cur->leftChild;         else parent->rightChild=cur->leftChild;     }     //第四种情况 待删除节点只有右子树     else if(cur->rightChild&&cur->leftChild==NULL)     {         if(cur==parent->leftChild) parent->leftChild=cur->rightChild;         else parent->rightChild=cur->rightChild;     }     //第五种情况 待删除子树左右子树都有  复制删除 找左子树的最大     else     {         BinaryTreeNode*temp=cur->leftChild;//左子树最大         while(temp->rightChild!=NULL)         {             temp=temp->rightChild;         }         cur->value=temp->value;         del(temp,temp->value);     } }
int main() {     BinaryTreeNode* node[6];     node[0]=new BinaryTreeNode(17);     node[1]=new BinaryTreeNode(15);     node[2]=new BinaryTreeNode(20);     node[3]=new BinaryTreeNode(12);     node[4]=new BinaryTreeNode(16);     node[5]=new BinaryTreeNode(18);
    BinarySearchTree t1(node[0]);     node[0]->leftChildVal(node[1]);     node[0]->rightChildVal(node[2]);     node[1]->leftChildVal(node[3]);     node[1]->rightChildVal(node[4]);     node[2]->leftChildVal(node[5]);     t1.levelOrder(t1.getRoot());
    //查找部分主函数     int key1=12,key2=30;     BinaryTreeNode* N1=t1.search(t1.getRoot(),key1);     if(N1==NULL){cout<<"没有查找到"<<key1<<endl;}     else {cout<<"找到了这个数,";N1->print();}     BinaryTreeNode* N2=t1.search(t1.getRoot(),key2);     if(N2==NULL){cout<<"没有查找到"<<key2<<endl;}     else {cout<<"找到了这个数,";N1->print();}
    //插入部分主函数     t1.insert(t1.getRoot(),22);     t1.levelOrder(t1.getRoot());     t1.insert(t1.getRoot(),13);     t1.levelOrder(t1.getRoot());     //删除部分主函数     t1.del(t1.getRoot(),13);     t1.levelOrder(t1.getRoot());     return 0; }

标签:node,cur,temp,BinaryTreeNode,二叉,插入,leftChild,查找,NULL
From: https://www.cnblogs.com/wzzz-blogs/p/17831371.html

相关文章

  • 根据行列标题名称,查找二维数据源的值区域内容!
    1职场实例小伙伴们大家好,随着冬至的到来,天气也是越发的寒冷起来,不少地方竟然飘起了今年第一场早雪,而我们今天要讲解重温一个Excel界热度很高的问题:如何根据行列标题名称,查找二维数据源的值区域内容?如下图所示:A1:D4单元格为数据源区域。数据源区域是一个明显的二维表格式的表格。A列......
  • 面试必刷TOP101:27、按之字形顺序打印二叉树
    题目题解importjava.util.*;/**publicclassTreeNode{*intval=0;*TreeNodeleft=null;*TreeNoderight=null;*publicTreeNode(intval){*this.val=val;*}*}*/publicclassSolution{/***代码中的类名、方......
  • 35-二分查找
    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(logn) 的算法。 示例1:输入:nums=[1,3,5,6],target=5输出:2示例 2:输入:nums=[1,3,5,6],target=2输......
  • JavaSE day06【排序查找算法,Map集合,集合的嵌套,斗地主案例】测评题
    选择题题目1(多选):下列关于TreeSet集合排序的原理正确的是()选项:​ A.排序方法如果返回的是小于0,代表的是当前元素较小,需要存放在左边​ B.排序方法如果返回的是大于0,代表的是当前元素较大,需要存放在右边​ C.排序此方法如果返回的是0,代表的是当前元......
  • mysql中插入emoji报错
    因为项目使用了微信登录,所以会拉取微信用户信息保存到本地数据库中,以前一直没啥问题,今天有个用户就是登不上,其他人都是可以正常登录的,结果查了一下发现他的用户名称有emiji,解决办法还算挺多的1.将数据库的utf8编码转换成utf8mb4的编码2.判断emoj进行阶段,只取汉字3.第三方依赖包......
  • Excel word pdf查找
    importorg.apache.commons.lang.StringUtils;importorg.apache.pdfbox.pdmodel.PDDocument;importorg.apache.pdfbox.text.PDFTextStripper;importorg.apache.poi.ooxml.POIXMLDocument;importorg.apache.poi.openxml4j.opc.OPCPackage;importorg.apache.poi.xssf.......
  • 二叉树
    1二叉树的定义:每个结点至多只有两棵子树,并且树的子树有左右之分,其次序不能任意颠倒。2性质:二叉树的第i层最多有2^(i-1)个结点。3深度为k的二叉树最多有2^k-1个结点。4任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1.5一个有n个结点的完全二叉树其深度为log以2......
  • 二叉树的前序、中序、后序、层序遍历
    在写遍历函数前,我们需要知道这几种遍历方法的访问结点的顺序。前序遍历:1.先访问根节点。2.再访问左子树。3.最后访问右子树。中序遍历:1.先访问左子树。2.在访问根结点。3.最后访问右子树。后序遍历:1.先访问左子树。2.在访问右子树。3.最后访问根结点。层序遍历:按照......
  • Word查找替换中的正则表达式
    正则表达式,多么高大上的一个叫法啊……高大上有的时候,等同于难度大……难度大有的时候,等同于高高在上……好了,又回到高大上了……其实,是工具就是要用,裱上个“太难”的框子没什么意思,还是来点实在的……********************************************************************......
  • SharePoint 页面中插入自定义代码
    我们都知道SharePoint是对页面进行编辑的。对于一些有编程基础的人来说,可能需要对页面中插入代码,这样才能更好的对页面进行配置。但是在新版本的SharePointmodern页面来说,虽然我们可以插入Embed组件。但是Embed组件中是不允许提供Script和Html脚本的。只能插入iFrame......