二叉搜索树实现

本文给出二叉搜索树介绍和实现

 

首先说它的性质:所有的节点都满足,左子树上所有的节点都比自己小,右边的都比自己大。

 

那这个结构有什么有用呢?

首先可以快速二分查找。还可以中序遍历得到升序序列,等等。。。

基本操作:

1、插入某个数值

2、查询是否包含某个数值

3、删除某个数值

 

根据实现不同,还可以实现其他很多种操作。

 

实现思路思路:

前两个操作很好想,就是不断比较,大了往左走,小了往右走。到空了插入,或者到空都没找到。

而删除稍微复杂一些,有下面这几种情况:

1、需要删除的节点没有左儿子,那就把右儿子提上去就好了。

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

3、以上都不满足,就把左儿子子孙中最大节点提上来。

 

当然,反过来也是成立的,比如右儿子子孙中最小的节点。

 

下面来叙述为什么可以这么做。

下图中A为待删除节点。

第一种情况:

 

1、去掉A,把c提上来,c也是小于x的没问题。

2、根据定义可知,x左边的所有点都小于它,把c提上来不影响规则。

 

第二种情况

 

3、B<A<C,所以B<C,根据刚才的叙述,B可以提上去,c可以放在b右边,不影响规则

4、同理

 

第三种情况

 

5、注意:是把黑色的提升上来,不是所谓的最右边的那个,因为当初向左拐了,他一定小。

因为黑色是最大,比B以及B所有的孩子都大,所以让B当左孩子没问题

而黑点小于A,也就小于c,所以可以让c当右孩子

大概证明就这样。。

下面我们用代码实现并通过注释理解

上次链表之类的用的c,循环来写的。这次就c++函数递归吧,不同方式练习。

定义

struct node
{int val;//数据node *lch,*rch;//左右孩子
};

插入

 node *insert(node *p,int x){if(p==NULL)//直到空就创建节点{node *q=new node;q->val=x;q->lch=q->rch=NULL;return p;}if(x<p->val)p->lch=insert(p->lch,x);else p->lch=insert(p->rch,x);return p;//依次返回自己,让上一个函数执行。}

查找

 bool find(node *p,int x){if(p==NULL)return false;else if(x==p->val)return true;else if(x<p->val)return find(p->lch,x);else return find(p->rch,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->lch=remove(p->rch,x);//以下为找到了之后else if(p->lch==NULL)//情况1{node *q=p->rch;delete p;return q;}else if(p->lch->rch)//情况2{node *q=p->lch;q->rch=p->rch;delete p;return q;}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;//调整黑点左孩子为Br->rch=p->rch;//调整黑点右孩子为cdelete p;//删除return r;//返回给父}return p;}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python基础小白题

题目1&#xff1a;有1、2、3、4四个数&#xff0c;能组成多少个互不相同且无重复的三位数&#xff1f;都是多少&#xff1f; list_num[1,2,3,4] all_num[] for i in list_num: for j in list_num: for k in list_num : if (i!j) and (i!k) and (j!k): numi*100j*10k all_num…

python基础小白题2

题目11&#xff1a;判断101-200之间有多少个素数&#xff0c;并输出所有素数。 num[] for i in range(100,201): ji//2 for k in range(2,j): if i%k0: break else: num.append(i) print(一共有%d个素数\n这些素数是&#xff1a; %len(num),num ) 输出结果&am…

python基础小白题3

题目021&#xff1a;猴子吃桃问题 猴子第一天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不瘾&#xff0c;又多吃了一个 第二天早上又将剩下的桃子吃掉一半&#xff0c;又多吃了一个。 以后每天早上都吃了前一天剩下的一半零一个。 到第10天早上想再吃时&#x…

python基础小白题4

题目031&#xff1a;请输入星期几的第一个字母来判断一下是星期几&#xff0c;如果第一个字母一样&#xff0c;则继续判断第二个字母。 def tm031(): 【个人备注】&#xff1a;按照题意要求实现了就行 week [monday,tuesday,wednesday,thursday,friday,saturday,sunday] inp…

python基础小白题5

题目045&#xff1a;统计 1 到 100 之和。 def tm045(): 【个人备注】&#xff1a;简单&#xff0c;但官网有人写的更简单 s 0 for i in range(1,101): si print(s) # 更简洁的方法 print(sum(range(1,101))) 题目046&#xff1a;求输入数字的平方&#xff0c;如果平方运算…

快排-荷兰国旗

在使用partition-exchange排序算法时&#xff0c;如快速排序算法&#xff0c;我们会遇到一些问题&#xff0c;比如重复元素太多&#xff0c;降低了效率&#xff0c;在每次递归中&#xff0c;左边部分是空的(没有元素比关键元素小)&#xff0c;而右边部分只能一个一个递减移动。…

快排-前m大元素

描述 给定一个数组包含n个元素&#xff0c;统计前m大的数并且把这m个数从大到小输 出。 输入 第一行包含一个整数n&#xff0c;表示数组的大小。n < 100000。 第二行包含n个整数&#xff0c;表示数组的元素&#xff0c;整数之间以一个空格分开 。每个整数的绝对值不超过…

归并-求逆序数

考虑1,2,…,n (n < 100000)的排列i1&#xff0c;i2&#xff0c;…&#xff0c;in&#xff0c;如果其中存在j,k&#xff0c;满足 j < k 且 ij > ik&#xff0c; 那么就称(ij,ik)是这个排列的一个逆序。 一个排列含有逆序的个数称为这个排列的逆序数。例如排列 26345…

动态规划概述

注&#xff1a;第一次看不需要全理解&#xff0c;以后动态规划做多了&#xff0c;再回来看看&#xff0c;会有更深的理解 先符上其它文章&#xff0c;看完这篇就可以开始看这些咯。 萌新&#xff1a; …

动态规划-背包是否装满

很简单但是需要特别注意的&#xff0c;一定不要错。 背包&#xff1a; 有n 种不同的物品&#xff0c;每个物品有两个属性&#xff0c;v体积&#xff0c;c价值&#xff0c;现在给一个体积为 m 的背包&#xff0c;问最多可带走多少价值的物品。 状态转移方程 dp[i][j]max…

dp打开思路3:HDU1069 POJ3616 POJ1088

HDU 1069 题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1069 题意&#xff1a;把给定的长方体&#xff08;不限&#xff09;叠加在一起&#xff0c;叠加的条件是&#xff0c;上面一个长方体的长和宽都比下面长方体的长 和宽短&#xff1b;求这些长方体能…

输入输出外挂

板子不解释 //适用于正负整数 template <class T> inline bool scan_d(T &ret) {char c; int sgn;if(cgetchar(),cEOF) return 0; //EOFwhile(c!−&&(c<0||c>9)) cgetchar();sgn(c−)?−1:1;ret(c−)?0:(c−0);while(cgetchar(),c>0&&c&…

dp打开思路4:POJ1189 UVA12511 HDU2845 HBCPC K

POJ1189 http://poj.org/problem?id1189 怎么说呢&#xff0c;不算难&#xff0c;但是容易出问题 我一开始的思路是&#xff0c;第一个钉子只有一种情况&#xff0c;然后下面每个钉子&#xff1a;左边有钉子就加左边的情况数&#xff0c;右边有钉子就加右边的情况数&#x…

第五次课 课上代码

第五次 双重循环——排序&#xff08;复习&#xff09; While循环 Break continue 字符串&#xff08;len&#xff0c;取值改值&#xff0c;格式化&#xff09; 列表生成式 >>> for i in range(4): for j in range(4): print(i,j) 0 0 0 1 0 2 0 3 1…

第六次课 课上代码

oj的使用 Python Split 函数&#xff08;优点&#xff1a;抽象、简洁。 举例&#xff1a;str\int\float\abs 具体实现&#xff09; ninput().split(" ") 3 4 >>> print(int(n[0])int(n[1])) 7 >>> print(12345) 15 l[1,2,3,4,5] >>&g…

橙白oj18训练作业1-题解、代码

学习资料和oj如何使用加软件官方qq群739979255 oj网址&#xff1a;http://oj.acm-icpc.top/ a题&#xff1a;原题为输入两个数&#xff0c;一行&#xff0c;用空格隔开&#xff0c;因为python操作对萌新来说略难&#xff0c;改为一行一个数&#xff0c;算出ab。 思路&#x…

橙白oj18训练作业2-题解、代码

http://oj.acm-icpc.top/ a题&#xff1a;三个数字排序 可以利用sort函数排序&#xff0c;或者自己想清楚逻辑自己写&#xff0c;我给出一个正确逻辑 &#xff08;拓展冒泡和其他排序参考https://blog.csdn.net/hebtu666/article/details/81434236&#xff09; a,b,cinput(…

时间空间复杂度概述

找个时间写一写时间复杂度和一些问题分类&#xff0c;也普及一下这方面知识。 如何衡量一个算法好坏 很显然&#xff0c;最重要的两个指标&#xff1a;需要多久可以解决问题、解决问题耗费了多少资源 那我们首先说第一个问题&#xff0c;要多长时间来解决某个问题。那我们可…

二叉树遍历算法总结

文章目录前提要素深度优先搜索DFS经典遍历算法前序遍历递归版迭代版中序遍历递归版迭代版后序遍历递归版迭代版Morris遍历算法中序遍历前序遍历后序遍历广度优先搜索BFS按层遍历参考资料前提要素 本文代码用Java实现。 //二叉树节点结构 public static class TreeNode {publi…