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