二叉搜索樹實現

本文給出二叉搜索樹介紹和實現

?

首先說它的性質:所有的節點都滿足,左子樹上所有的節點都比自己小,右邊的都比自己大。

?

那這個結構有什么有用呢?

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

基本操作:

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.pswp.cn/news/445644.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445644.shtml
英文地址,請注明出處:http://en.pswp.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…