二叉排序樹

2021-07-11 02:39:56 字數 1882 閱讀 3982

可以理解為中序遍歷,

typedef

int keytype;  

typedef

struct node  

node,*pnode;  

//往二叉查詢樹中插入結點

//插入的話,可能要改變根結點的位址,所以傳的是二級指標

void inseart(pnode * root,keytype key)  

//插入到當前結點(*root)的左孩子

if((*root)->left == null && (*root)->key > key)  

//插入到當前結點(*root)的右孩子

if((*root)->right == null && (*root)->key < key)  

if((*root)->key > key)  

inseart(&(*root)->left,key);  

else

if((*root)->key < key)  

inseart(&(*root)->right,key);  

else

return;  

}  //查詢元素,找到返回關鍵字的結點指標,沒找到返回null

pnode search(pnode root,keytype key)  

//查詢最小關鍵字,空樹時返回null

pnode searchmin(pnode root)  

//查詢最大關鍵字,空樹時返回null

pnode searchmax(pnode root)  

//查詢某個結點的前驅

pnode searchpredecessor(pnode p)  

return p->parent;  

}  }  

//查詢某個結點的後繼

pnode searchsuccessor(pnode p)  

return p->parent;  

}  }  

//根據關鍵字刪除某個結點,刪除成功返回1,否則返回0

//如果把根結點刪掉,那麼要改變根結點的位址,所以傳二級指標

int deletenode(pnode* root,keytype key)  

else  

}  //2.被刪結點只有左子樹

else

if(p->left && !(p->right))  

//3.被刪結點只有右孩子

else

if(p->right && !(p->left))  

//4.被刪除的結點既有左孩子,又有右孩子

//該結點的後繼結點肯定無左子樹(參考上面查詢後繼結點函式)

//刪掉後繼結點,後繼結點的值代替該結點

else  

return 1;  

}  //建立一棵二叉查詢樹

void create(pnode* root,keytype *keyarray,int length)  

int main(void)  

;  create(&root,nodearray,11);  

for(i=0;i<2;i++)  

deletenode(&root,nodearray[i]);  

printf("%d\n",searchpredecessor(root)->key);  

printf("%d\n",searchsuccessor(root)->key);  

printf("%d\n",searchmin(root)->key);  

printf("%d\n",searchmax(root)->key);  

printf("%d\n",search(root,13)->key);  

return 0;  

二叉排序樹

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

二叉排序樹

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

二叉排序樹

include include include include struct tree node void insert node struct tree node int void pre order struct tree node void in order struct tree node ...