演算法精解(七) C語言描述(二叉搜尋樹)

2021-09-12 08:38:38 字數 2068 閱讀 3103

二叉樹搜尋樹概念

二叉搜尋樹是一種用於查詢操作的高效資料結構,最壞情況只需查詢乙個分支 的資料即可,而不用檢索所有資料,所以操作的複雜度為o(lg n).

#include"bitree.h"

typedef bitree bistree;

//初始化二叉搜尋樹,compare用於比較key1>key2?1:-1(= 0)

void bistree_init(bistree *tree, void(*compare)(const void *key1, const void *key2),

void(*destroy)(void *data));

//銷毀樹

void bistree_destroy(bistree *tree);

//插入節點,成功返回0,要插入的節點已存在返回1,否則-1

int bistree_insert(bistree *tree, const void *data); //複雜度lg n

//移除等於data的節點,成功返回0,否則-1

int bistree_remove(bistree *tree, const void *data); //複雜度lg n

//查詢對應data的節點,成功返回0,否則-1

int bistree_lookup(const bistree *tree, void **data); //複雜度lg n

//銷毀node節點開始的左分支

static void destroy_right(bistree *tree, bitreenode *node);

static void destroy_left(bistree *tree, bitreenode *node)

//釋放節點空間,size--

free((*position)->data);

free(*position);

*position = null;

tree->size--;

} return;

}//在樹tree的node節點開始插入data資料

static int insert(bistree *tree, bitreenode **node, const void *data)

else

else

}} else if(cmpval > 0)

else

}} else //如果node->data == data,則為資料衝突

}return 0;

}//在樹tree的node節點開始查詢data資料

static int lookup(bistree *tree, bitreenode *node,const void **data)

//比較插入節點和要插入資料的值

cmpval = tree->compare(*data, node->data);

if (cmpval < 0) //如果插入資料小於node->data,在node的左子樹尋找位置繼續比較

retval = lookup(tree, node->left, data);

else if (cmpval > 0) //如果插入資料大於node->data,在node的右子樹尋找位置繼續比較

retval = lookup(tree, node->right, data);

else //等於時,取出資料

return retval;

}void bistree_init(bistree *tree, int(*compare)(const void *key1, const void *key2), void(*destroy)(void *data))

void bistree_destroy(bistree *tree)

int bistree_insert(bistree *tree, const void *data)

int bistree_remove(bistree *tree, const void *data)

int bistree_lookup(bistree *tree, void **data)

二叉搜尋樹(C語言)

學習二叉搜尋樹的過程中,對於刪除操作中的兩個節點都存在的情況進行 編寫時,出現了疑惑,所以我著重講解一下刪除操作 首先進行資料的宣告 include includetypedef int data type 宣告元素型別 typedef struct bst nodebst t,bst p 傳入根節...

C語言 二叉搜尋樹

實現過程 二叉查詢樹 binary search tree 又 二叉搜尋樹,二叉排序樹 它或者是一棵空樹,或者是具有下列性質的二叉樹 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 它的左 右子樹也分別為二叉排序樹。簡而言之...

C語言二叉搜尋樹

7 4 是否同一棵二叉搜尋樹 25 分 給定乙個插入序列就可以唯一確定一棵二叉搜尋樹。然而,一棵給定的二叉搜尋樹卻可以由多種不同的插入序列得到。例如分別按照序列和插入初始為空的二叉搜尋樹,都得到一樣的結果。於是對於輸入的各種插入序列,你需要判斷它們是否能生成一樣的二叉搜尋樹。輸入包含若干組測試資料。...