1. 查詢樹的建立(createtree)
假設有如下陣列4,1,45,78,345,23,12,3,6,21
首先選定4為root,然後遍歷剩下的數字,如果大於等於4則放到4的右側,小於4放到4的左側,最後構建成的樹:所有的左孩子都小於父節點,所有的右孩子都大於等於父節點。如下圖:
2. 遍歷查詢樹(displaytree)
按照左中右的順序遍歷樹,結果為:1,3,4,5,12,21,23,45,78,345,遍歷的結果就是已經排好序的數字。
3. 查詢樹中的節點(searchtree)
從根節點開始,如果大於等於根節點,則查詢根節點的右側;如果小於根節點,則查詢根節點的左側,直到查詢到節點。
比如要查詢12:
比4大,往右走;
比45小,往左走;
比23小,往左走;
找到12
4. 刪除樹中的節點(deletenode)
這個是最複雜的,因為刪除完節點後要重新構建樹,涉及到的情況很多:
a.要刪除的node沒有左右孩子,有父節點。
如果要刪除的node為父節點的左孩子,則將父節點的左孩子指標設定為null;如果要刪除的node為父節點的右孩子,則將父節點的右孩子指標設定為null。最後刪除node。
b.要刪除的node沒有左右孩子,沒有父節點(即根節點)。
根節點設為null,刪除node。
c.要刪除的node有左孩子沒右孩子,有父節點
如果要刪除的node為父節點的左孩子,則將父節點的左孩子設定為要被刪除node的左孩子;如果要刪除的node為父節點的右孩子,則將父節點的右孩子指標設定為要被刪除node的左孩子。最後刪除node。
d.要被刪除的node有左孩子沒有右孩子,沒有父節點
將要被刪除的node的左孩子設定為根節點,刪除node。
e.要刪除的node有右孩子沒左孩子,有父節點
如果要刪除的node為父節點的左孩子,則將父節點的左孩子設定為要被刪除node的右孩子;如果要刪除的node為父節點的右孩子,則將父節點的右孩子指標設定為要被刪除node的右孩子。最後刪除node。
f.要被刪除的node有右孩子沒有左孩子,沒有父節點
將要被刪除的node的右孩子設定為根節點,刪除node。
g.要被刪除的node左右孩子都有,有父節點
將要被刪除node的右孩子插入到左孩子中去。如果要刪除的node為父節點的左孩子,則將父節點的左孩子設定為要被刪除node的左孩子;如果要刪除的node為父節點的右孩子,則將父節點的右孩子指標設定為要被刪除node的左孩子。最後刪除node。
h.要被刪除的node左右孩子都有,無父節點
將要被刪除node的右孩子插入到左孩子中去,父節點修改為要被刪除node的左孩子,刪除node節點。
c**如下:
1 #include 2 #include 34#define size 10
56 typedef struct
tagnodetreenode;
1112
//列印陣列
13void displayarray(int array,int
size)
19 printf("\n"
);20}21
22//
按左中右順序遍歷樹
23void displaytree(treenode*node)
2930 printf("
%d ",node->value);
3132
if(node->right !=null)35}
3637
//查詢以node為節點的樹中上是否存在vlaue的節點
38 treenode* searchtree(treenode* node, int
value)else
if(node->value >value)else
47 }else
else53}
54}5556
//查詢以node為節點的樹中上是否存在vlaue的節點,parent為查詢到的節點的父節點。
57//
dir為1表示parent節點的左節點為查詢結果
58//
dir為2表示parent節點的右節點為查詢結果
59 treenode* searchtreewithparent(treenode* node, treenode** parent, int* dir, int
value)else
if(node->value >value)else
70 }else
else78}
79}8081
//將inode插入到以node為根節點的樹中
82void insertnode(treenode* node, treenode*inode)
8788
if(inode->value < node->value && node->left !=null)
9293
if(inode->value >= node->value && node->right ==null)
9697
if(inode->value < node->value && node->left ==null)
100}
101102
//從以root為根節點的樹中刪除值為value的節點
103void deletenode(treenode** root, int
value)else
else
120 }else
if(deletenode->left != null && deletenode->right ==null)else
130 }else
if(deletenode->left == null && deletenode->right !=null)else
140 }else
else
151}
152free
(deletenode);
153 deletenode =null;
154}
155}
156157
//使用array陣列中的數,建立以root為根節點的樹,
158void createtree(treenode** root, int array, int
size)
173}
174175
//刪除以node為根節點的樹
176void deletetree(treenode*node)
182183
if(node->right !=null)
186187
if(node->left == null && node->right ==null)
191}
192193
int main(int argc, char*ar**);
196displayarray(array,size);
197198 treenode *root =null;
199200 createtree(&root, array, size);
201202 printf("
the tree is(left->middle->right):");
203displaytree(root);
204 printf("\n"
);205
206int value = atoi(ar**[1
]);207 treenode* parent =null;
208int dir = -1
;209 printf("
search value %d:
",value);
210if(searchtree(root,value) !=null)else
215216 printf("
delete value:%d
",value);
217 deletenode(&root,value);
218 printf("\n"
);219 printf("
the tree is(left->middle->right):");
220displaytree(root);
221 printf("\n"
);222
223deletetree(root);
224return0;
225 }
二叉樹(二)之二叉查詢樹
目錄 一 二叉查詢樹的概念 二 二叉查詢樹的實現 三 二叉查詢樹 binary search tree 又被稱為二叉搜尋樹。它是特殊的二叉樹 對於二叉樹,假設x為二叉樹中的任意乙個結點,x節點包含關鍵字key,節點x的key值記為key x 如果y是x的左子樹中的乙個結點,則key y key x ...
動態查詢之二叉樹查詢 c 實現
演算法思想 二叉搜尋樹 又稱二叉查詢樹或二叉排序樹 bst樹 二叉查詢樹 二叉查詢樹,也稱二叉搜尋樹,或二叉排序樹。其定義也比較簡單,要麼是一顆空樹,要麼就是具有如下性質的二叉樹 1 若任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 2 若任意節點的右子樹不空,則右子樹上所有結點的...
演算法之 二叉樹的查詢
由於自己的一時糊塗,將英語單詞left和right弄反了,給你們的閱讀帶來很多不便,所以還是盡情諒解,由於是個人的 新手,所以有很多肯能你們認為不對的地方,還是請大家多提意見!c語言 codee 11760 include include define max 1 10 struct node ty...