二叉排序樹

2021-10-04 00:21:52 字數 2075 閱讀 7382

假設我們有乙個陣列int arr = ;現在我們要將這10個元素加入到乙個二叉排序樹中。即從第乙個元素開始加入。

1.如果根節點為空,那麼直接賦值即可。

2.如果根節點不為空,那麼判斷將要插入的資料與節點中的資料進行比較,如果當前節點的資料大於要插入的資料key,那麼將指標指向當前節點的左,否則指向右,知道當前節點為空,進行賦值即可。

對於建立樹的過程可以採用遞迴或者迴圈,以下**都會進行演示

== 定義二叉排序樹的節點==

typedef

struct nodetree;

二叉排序樹的新增節點

遞迴建立

void

createtree

(tree*

* p,

int key)if(

(*p)

->data > key)

elseif(

(*p)

->data < key)

else

}

非遞迴建立

void

createtree

(tree*

* p,

int key)

tree* pnode =

null

; tree* pmark =

*p; pnode =

(tree*

)malloc

(sizeof

(tree));

pnode->data = key;

pnode->pleft =

null

; pnode->pright =

null

;while

(pmark)

pmark = pmark->pleft;

}else

if(pmark->data < key)

pmark = pmark->pright;

}else

}}

二叉排序樹的刪除操作要麻煩一些,畢竟不像單鏈表那樣遍歷然後直接乙個刪除就可以了,二叉樹排序樹中要刪除節點,首先要找到節點,然後判斷節點的左右子樹是否為空,如果為空說明他是葉子節點,就可以直接刪除,但是,如果不是葉子節點呢,我們可以通過迴圈將它變成乙個葉子節點就可以了。最後一定要主要指標的指向。

過程:

查詢待刪除元素的位置

判斷是否是葉子節點

2.1 如果是葉子節點,直接進行刪除,並將該節點的父節點對應的指標置空。

2.2 如果不是葉子節點,那麼就找這個節點的左的最右,進行值的覆蓋,然後刪除這個左的最右就可以了。

void

deletenode

(tree*

* p.

int key)

else

if(pdel->data < key)

else

}//如果沒有找到直接return

if(flag ==0)

//有兩個孩子

if(pdel->pleft !=

null

&& pdel->pright !=

null

) pmark->data = pdel->data;

}//只有乙個或零個孩子

if(pnode ==

null

)//被刪除節點是根節點

if(pdel == pnode->pleft)

else

free

(pdel)

; pdel =

null;}

//上面只有乙個或另個孩子的情況,由於經過有兩個孩子的那段**後,待刪除節點只能有乙個或者零個節點,不再存在兩個節點的情況了。

以上就是二叉排序樹的新增節點個刪除節點,以上**均在vs 2017環境下成功執行,若有差錯請指出,先行謝過。

二叉排序樹

在複習資料結構,把這個東西總結一下。這種結構是動態查詢表,這種動態是相對靜態查詢 順序查詢,折半查詢,分塊查詢等 來說的。對於各種靜態鍊錶,要達到查詢複雜度為o logn 必須要求有序 而要使插入刪除複雜度為o 1 必須是鍊錶儲存。動態查詢表就可以同時滿足這兩者。動態查詢表的特點是表結構本身在查詢過...

二叉排序樹

name 二叉排序樹相關操作 author unimen date 2011 10 8 13 14 21 刪除結點比較麻煩,總結如下 4大種情況 1 結點p無右孩子 將該點的左孩子變為其在雙親中的同位孩子 1 p為其雙親的左孩子時將其的左孩子變為雙親的左孩子 2 p為其雙親的右孩子時將其的左孩子變為...

二叉排序樹

include include include include struct tree node void insert node struct tree node int void pre order struct tree node void in order struct tree node ...