排序二叉樹or搜尋二叉樹or查詢二叉樹

2021-08-13 14:40:49 字數 2921 閱讀 7794

排序二叉樹,搜尋二叉樹,查詢二叉樹都是乙個意思,只是叫法不同而已。下面的文章中我們統稱為排序二叉樹。本文主要是針對高中資訊學,因此其中不涉及到指標,所有需要用指標的地方都直接使用陣列進行模擬。

排序二叉樹定義:

(1)若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值;

(2)若右子樹不空,則右子樹上所有結點的值均大於或等於它的根結點的值;

(3)左、右子樹也分別為二叉排序樹;

從定義中我們可以知道:左《根《右;因此使用中序遍歷排序二叉樹一定是乙個遞增序列。

節點定義:

[cpp]view plain

copy

struct

node;  

[cpp]view plain

copy

node arr[105]=;

//定義乙個大小為105的陣列。可以裝105個元素,

[cpp]view plain

copy

introot=1;

//根節點對應的陣列下標

建樹:排序二叉樹的建立並不難,因為建樹的過程就是將值乙個乙個插入到樹中去的過程。例如這裡使用隨機函式生成100個隨機值,然後依次插入到排序二叉樹中就完成了建樹。

[cpp]view plain

copy

srand(unsigned(time(null)));  

intx;  

for(

inti=1;i<101;i++)  

插入元素:

向二叉樹中插入元素需要通過將待插入的值和某個節點對比,決定是插入到這個節點的左邊還是右邊。例如要想下面的二叉樹中插入21,首先21和3相比,比3大則一定在3的右邊,然後21和8比,又大;則到8的右邊,而8的右邊沒有,那麼將21插入作為8的右兒子

實現**:

[cpp]view plain

copy

void

insert(

intindex,

inti)  

if(arr[index].left!=0&&x//如果x插入

insert(arr[index].left,i);  

else

if(arr[index].right!=0&&x>y)"font-family: arial, helvetica, sans-serif;"

>

//如果x插入

insert(arr[index].right,i);  

else

if(arr[index].left==0&&x"font-family: arial, helvetica, sans-serif;"

>

//如果x插入到y的

左邊     arr[index].left=i;  

arr[index].freq=1;  

arr[i].father=index;  

return

;  }  

else

if(arr[index].right==0&&x>y)  

}  

查詢元素:

查詢元素很容易,只有兩種結果:找到和找不到。找到就是其中某個值和要查詢的值相等,找不到就是把樹都走完了,但是還是沒有相等的。查詢和插入很相似,同樣是通過比較決定到左還是右邊去查詢。

比如:查詢7

1.和12相比小------左

2.和6相比大--------右

3.和8相比小--------左

4.和7相比等--------找到

若是在第3步,8不存在左子樹,那麼返回找不到

實現**:

[cpp]view plain

copy

intfind(

intr,

intda)  

}  

刪除元素:

刪除元素是排序二叉樹中最難的操作,比較繁雜。因為刪除乙個元素有幾種情況:

1.該元素是葉子結點

2.該元素只有左子樹

3.該元素只有右子樹

4.該元素左右子樹都存在

這還沒完,我們刪除的時候還要判斷我們要刪除的元素到底是他的父元素的左兒子還是右兒子。以及要判斷刪除的節點是不是根節點。

其實對於前三種情況都簡單;關鍵是第4種兩個子樹都存在的情況,這裡刪除操作有幾種方法:

1.找到右子樹中最小的值min,然後用min替換要刪除的元素,最後刪掉min。

2.找到左子樹中最大值max,然後用max替換要刪除的元素,最後刪掉max

3.找到左子樹中的最大值max,然後將右子樹作為max的右子樹,最後將元素刪除並讓該元素的左兒子上位。

4.和3一樣,找到右子樹min,然後接上去。。。。。。

這裡可以看到這裡的四種方式前兩種操作起來要容易一些,可以省一些事。

例如我要刪除圖中的6

1.用7覆蓋6,然後刪除7

2.5覆蓋6,刪除5

3.將3作為12的左兒子,然後把6的右兒子連到5的右邊

**實現

[cpp]view plain

copy

void

del(

intindex,

intnum)  

"white-space:pre"

>      arr[temp].father=0;  

"white-space:pre"

>  }  

"white-space:pre"

>  

else

{  

排序二叉樹or搜尋二叉樹or查詢二叉樹

排序二叉樹,搜尋二叉樹,查詢二叉樹都是乙個意思,只是叫法不同而已。下面的文章中我們統稱為排序二叉樹。本文主要是針對高中資訊學,因此其中不涉及到指標,所有需要用指標的地方都直接使用陣列進行模擬。排序二叉樹定義 1 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值 2 若右子樹不空,則右子...

二叉樹,排序二叉樹

說到二叉樹,這可是資料結構裡面的非常重要的一種資料結構,二叉樹是樹的一種,本身具有遞迴性質,所以基於二叉樹的一些演算法很容易用遞迴演算法去實現。作為一種非線性結構,比起線性結構還是相對複雜的,很多人甚至看不懂演算法的意思,不能理解。其實一開始接觸這些東西還是挺暈的,不過你多看幾遍,上機實現可能你就會...

二叉樹 還原二叉樹 二叉搜尋樹

先序遍歷的特點 先遍歷根結點,再遍歷左子樹,最後再遍歷右子樹 中序遍歷的特點 先遍歷左子樹,再遍歷根結點,最後再遍歷右子樹 後序遍歷的特點 先遍歷左子樹,再遍歷右子樹,最後再遍歷根結點 舉例 先序遍歷 a b d f g h i e c 中序遍歷 f d h g i b e a c 如上,根據先序遍...