c c 二叉排序樹

2022-05-18 04:27:38 字數 4343 閱讀 4107

概念:

左樹的所有節點的值(包括子節點)必須小於中心節點,右樹所有節點的值(包括子節點)必須大於中心節點。

不允許有值相同的節點。

二叉排序樹的特點:

建立二叉排序樹的思路:

二叉排序樹的一些實用函式

init_bst

初始化二叉排序樹

insert_bst_tree

插入樹的節點

min求樹中最小節點

max求樹中最大節點

sort

排序二叉樹(中序遍歷就是從小到大排序了)

remove_bst

刪除節點

pattern1:要被刪除的節點是root節點

刪除45

刪除45

pattern2:要被刪除的節點是其父節點的左樹,並且要被刪除的節點有右樹

刪除12

pattern3:要被刪除的節點是其父節點的左樹,並且要被刪除的節點無右樹

刪除12

pattern4:要被刪除的節點是其父節點的右樹,並且要被刪除的節點無左樹

刪除53

pattern5:要被刪除的節點是其父節點的右樹,並且要被刪除的節點有左樹

刪除100

//初始化二叉排序樹

void init_bst(bst* bst);

//插入樹的節點

bool insert_bst_node(bstnode** t, t x);

bool insert_bst_tree(bst* bst, t x);

//求樹中最小節點

t min(bst* bst);

//求樹中最大節點

t max(bst* bst);

//排序

void sort(bst* bst);

//查詢父節點

bstnode* get_parent(bst* bst, bstnode* tar);

//刪除節點

bool remove_bst(bst* bst, t key);

//搜尋節點

bstnode* search_bst(bst* bst, t key);

//搜尋節點

bstnode* search_bst1(bst* bst, t key);

//清空樹

void clear_bst(bst* bst);

#endif

bst.c

#include "bst.h"

//初始化二叉排序樹

void init_bst(bst* bst)

//插入樹的節點

bool insert_bst_node(bstnode** t, t x)

else if(x < (*t)->data)

else if(x > (*t)->data)

return false;

}bool insert_bst_tree(bst* bst, t x)

//求樹中最小節點

t min_node(bstnode* t)

t min(bst* bst)

//求樹中最大節點

t max_node(bstnode* t)

return t->data;

}t max(bst* bst)

//二叉樹中序排序

void sort_node(bstnode* t)else

}void sort(bst* bst)

//搜尋節點

bstnode* search_node(bstnode* t, t key)

else

return p;

}}bstnode* search_bst(bst* bst, t key)

bstnode* search_node1(bstnode* t, t key)

else

else

}}bstnode* search_bst1(bst* bst, t key)

//清空樹

void clear_node(bstnode** t)

}void clear_bst(bst* bst)

//查詢父節點

bstnode* get_parent_node(bstnode* t, bstnode* tar)

else

return p;

}}bstnode* get_parent(bst* bst, bstnode* tar)

bool remove_bst(bst* bst, t key)

//因為要被刪除的頂點的左子節點,有右子節點,所以要找到最大的

if(x != tar->left)

//因為要被刪除的頂點的左子節點,沒有右子節點,所以它就是最大的

else

} //因為要被刪除的頂點沒有左子節點,所以要找到以右子節點為根的左子節點中值最小的

else

//要被刪除的頂點在父節點的右邊

else

}else

free(tar);

return true;

}while(x->left != null)

//因為要被刪除的頂點的右子節點,有左子節點,所以要找到最小的

if(x != tar->right)

} //要被刪除的節點不是根節點

if(parent != null)

//要被刪除的頂點在父節點的右邊

else

} else

free(tar);

}

bstmain.c

#include "bst.h"

int main();

//patten2 目標節點是root,root沒有右子節點,左子節點中沒有右子節點

//t ar = ;

//patten3 目標節點是root,只有root節點

//t ar = ;

//patten4 目標節點是root,root有右子節點,右子節點中沒有左子節點

//t ar = ;

//patten5 目標節點是root,root有右子節點,右子節點中有左子節點

//t ar = ;

//patten6 目標節點(8)不是root,目標節點有左子節點,左子節點沒有右邊

//t ar = ;

//patten7 目標節點(12)不是root,目標節點有左子節點,左子節點有右邊

//t ar = ;

//patten8 目標節點(120)不是root,目標節點沒有左子節點,右子節點沒有左邊

t ar = ;

//t ar = ;

//t ar = ;

int n = sizeof(ar) / sizeof(t);

for(int i = 0; i < n; ++i)

sort(&bst);

printf("\n");

//刪除節點

remove_bst(&bst, 45);

sort(&bst);

printf("\n");

clear_bst(&bst);

}

完整**

編譯方法:gcc -g bst.c bstmain.c

二叉排序樹相關操作(C C )

目錄 1 建立二叉樹 遞迴 2 建立二叉樹 非遞迴 3 前序遍歷 非遞迴 4 中序遍歷 非遞迴 5 後續遍歷 非遞迴 建立ordertree bitree t,int data void ordertree bitree t,int data else if data t data else if ...

二叉排序樹

在複習資料結構,把這個東西總結一下。這種結構是動態查詢表,這種動態是相對靜態查詢 順序查詢,折半查詢,分塊查詢等 來說的。對於各種靜態鍊錶,要達到查詢複雜度為o logn 必須要求有序 而要使插入刪除複雜度為o 1 必須是鍊錶儲存。動態查詢表就可以同時滿足這兩者。動態查詢表的特點是表結構本身在查詢過...

二叉排序樹

name 二叉排序樹相關操作 author unimen date 2011 10 8 13 14 21 刪除結點比較麻煩,總結如下 4大種情況 1 結點p無右孩子 將該點的左孩子變為其在雙親中的同位孩子 1 p為其雙親的左孩子時將其的左孩子變為雙親的左孩子 2 p為其雙親的右孩子時將其的左孩子變為...