概念:
左樹的所有節點的值(包括子節點)必須小於中心節點,右樹所有節點的值(包括子節點)必須大於中心節點。
不允許有值相同的節點。
二叉排序樹的特點:
建立二叉排序樹的思路:
二叉排序樹的一些實用函式
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為其雙親的右孩子時將其的左孩子變為...