假設我們有乙個陣列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 ...