二叉查找树的简单实现
二叉查找樹是 ? 左子節(jié)點 <= 根節(jié)點 <= 右子節(jié)點 的樹形結(jié)構(gòu),其平均時間復(fù)雜度:O(log2n)(簡單地說搜索方式跟二分法差不多)。
二叉排序樹是一種動態(tài)樹表。其特點是:樹的結(jié)構(gòu)通常不是一次生成的,而是在查找過程中,當樹中不存在關(guān)鍵字等于給定值的節(jié)點時再進行插入。
新插入的結(jié)點一定是一個新添加的葉子節(jié)點,并且是查找不成功時查找路徑上訪問的最后一個結(jié)點的左孩子或右孩子結(jié)點。
先定義二叉樹和樹節(jié)點:
typedef struct BST_node{int data;struct BST_node* left;struct BST_node* right; }BST_Node; typedef struct BST{BST_Node* root;size_t size; };再給出創(chuàng)建節(jié)點和刪除的函數(shù):
//定義一個函數(shù)用來用傳入的數(shù)據(jù)創(chuàng)建節(jié)點 BST_Node* creat(int data){BST_Node* node= (BST_Node*)malloc(sizeof(BST_Node));node->data = data;node->left = NULL;node->right = NULL;return node; }//定義一個函數(shù)用來刪除某個節(jié)點
void destroy(BST_Node* node){
free(node);
}
然后實現(xiàn)二叉查找樹的主要部分在于插入、刪除操作該如何實現(xiàn)。
首先來看插入:
要插入一個數(shù)據(jù),同時保持樹的特性不改變。這里根據(jù)要插入的數(shù)據(jù)與根節(jié)點數(shù)據(jù)的大小關(guān)系來選擇插入左子樹還是右子樹,當根節(jié)點為空節(jié)點時就放到根節(jié)點中;
//該函數(shù)用來向以root為根的子樹中插入node節(jié)點 void insert(BST_Node* node, BST_Node** root){//這里用二級指針的目的在于直接修改root為根的子樹,函數(shù)體中對源節(jié)點的修改要用一級指針的形式(二級解引用)if(!*root)*root = node;else if( node->data < (*root)->data)insert(node, &(*root)->left);//要插入左子樹時可以看成向左子節(jié)點為根的二叉樹中插入node,于是遞歸調(diào)用,這個遞歸終止條件就是*root為空,也就是說當找到某一路徑的最底層子節(jié)點的子節(jié)點時插入;//查找樹的特性通過if()中的判斷選擇來維持;elseinsert( node, &(*root)->right); } //插入函數(shù) void bst_insert(BST* bstree, int data){insert( creat(data), &bstree->root);++size; }
插入ok,再來刪除:
//先定義一個函數(shù)用來返回在以root為根節(jié)點的子樹中,查找到數(shù)據(jù)data的節(jié)點,然后如下圖所示: // 1 // / \ // 0 3 ->例如,要刪除3,找到3的節(jié)點,然后將節(jié)點3的左子樹挪到3的右子樹的最左下 // / \ (也就是把2插入到3的右子樹,當然結(jié)果肯定是在右子樹的最左下) // 2 4 (刪除的調(diào)整方法有兩種) // / \ / \ BST_Node* tofind(int data, BST_Node** root){if((*root)->data == data || !*root)return root;if(data < (*root)->data)tofind(data, &(*root)->left);if(data > (*root)->data)tofind(data, &(*root)->right); }bool delete(int data,BST* bstree){BST_Node** node = tofind(data, &(bstree->root));if(*node){insert((*node)->left, (*node)->right);BST_Node* node_tmp = *node;*node = (*node)->right;destroy(node_tmp);--size;return true;}elsereturn false; }刪除ok,其他的功能可以在插入、刪除的功能上擴展出來,不重復(fù)了。
?
轉(zhuǎn)載于:https://www.cnblogs.com/young8848/p/4382592.html
總結(jié)
以上是生活随笔為你收集整理的二叉查找树的简单实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu14.04LS中安装sogo
- 下一篇: 【hihocoder】三十九周:二分.归