可以理解為中序遍歷,
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 ...