查詢之二叉樹查詢

2021-09-08 11:16:41 字數 4462 閱讀 8772

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 3

4#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...