/**1.實現了遞迴 非遞迴插入(建立)二叉排序(搜尋)樹;
分別對應insert_binsnode(tbinsnode* t,int k),nonrecursion_insert_binsnode(tbinsnode* t,int k);
2.實現了遞迴 非遞迴查詢 二叉排序(搜尋)樹 ;
分別對應find_binsnode(tbinsnode *t,int s),nonrecursion_find_binsnode(tbinsnode *t,int s);
3. 實現了非遞迴刪除 二叉排序(搜尋)樹;
分別對應delete_binsnode();
4. 實現了遞迴先序、中序、後序遍歷二叉排序(搜尋)樹;
分別對應pre_print_binsnode(tbinsnode t),in_print_binsnode(tbinsnode t),post_print_binsnode(tbinsnode t);
*/#include
#include
typedef struct binstreenodeb程式設計客棧insnode,*tbinsnode;
int empty_tree(tbinsnode t)else
}/*---------------------非遞迴方法 二叉排序樹的刪除-----------------*/
void delete_binsnode(tbinsnode *t,int del)
//如果二叉排序樹不為空,先找到即將刪除的元素del.這裡再次實現一遍查詢,當然也可以修改一下find類的函式
while(cur && cur->num!=del)else
} if(!cur)
if(cur->num==del)
//如果找到待刪除的結點,立刻判斷該結點有無左子樹
//情況一:待刪除結點無左子樹
if(!cur->lchild)
if(pre->lchild && pre->lchild->num==del)
if(pre->rchild && pre->rchild->num==del)
} //情況二:待刪除的結點有左子樹。
if(cur->lchild)
if(pre->rchild && pre->rchild->num==del)
} //情況2.2:該左子樹有右子樹
if(lt->rchild)
www.cppcns.com cur->num=lt->num;
rblast->rchild=lt->lchild;
free(lt);
return;
} }}
/*--------------------遞迴方法 查詢 二叉排序樹-------------------*/
void find_binsnode(tbinsnode t,int s)
if(s>t->num)else
} /*-------------------非遞迴方法 查詢二叉排序樹--------------------*/
void nonrecursion_find_binsnode(tbinsnode t,int s)
while(t && s!=t->num )else
} if(!t)
if(s==t->num)
} /*-----------------遞迴方法 建立/插入 二叉排序樹------------------*/
void insert_binsnode(tbinsnode *t,int k)elseelse
} }/*----------------------先序遍歷二叉排序樹----------------------------------*/
void pre_print_binsnode(tbinsnode t)
}/*-----------------------中序遍歷二叉排序樹-----------------------------------*/
void in_print_binsnode(tbinsnode t)
}/*-----------------------後序遍歷二叉排序樹-----------------------------------*/
void post_print_binsnode(tbinsnode t)
}/*---------------------非遞迴 建立/插入 二叉排序樹---------------------------*/
void nonrecursion_insert_binsnode(tbinsnode *t,int k)elseelse
}p=(tbinsnode)malloc(sizeof(binsnode));
p->num=k;
p->lchild=p->rchild=null;
if(k>cur->num)
if(knum)
}} int main(void)
// scanf("%d",&s);
// find_binsnode(t,s);
// nonrecursion_find_binsnode(t,s);
pre_print_binsnode(t);
scanf("%d",&del);
delete_binsnode(&t,del);
pre_print_binsnode(t);
return 0;
} 本文標題: c語言二叉排序(搜尋)樹例項
本文位址:
二叉搜尋樹(C語言)
學習二叉搜尋樹的過程中,對於刪除操作中的兩個節點都存在的情況進行 編寫時,出現了疑惑,所以我著重講解一下刪除操作 首先進行資料的宣告 include includetypedef int data type 宣告元素型別 typedef struct bst nodebst t,bst p 傳入根節...
C語言 二叉搜尋樹
實現過程 二叉查詢樹 binary search tree 又 二叉搜尋樹,二叉排序樹 它或者是一棵空樹,或者是具有下列性質的二叉樹 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 它的左 右子樹也分別為二叉排序樹。簡而言之...
C語言二叉搜尋樹
7 4 是否同一棵二叉搜尋樹 25 分 給定乙個插入序列就可以唯一確定一棵二叉搜尋樹。然而,一棵給定的二叉搜尋樹卻可以由多種不同的插入序列得到。例如分別按照序列和插入初始為空的二叉搜尋樹,都得到一樣的結果。於是對於輸入的各種插入序列,你需要判斷它們是否能生成一樣的二叉搜尋樹。輸入包含若干組測試資料。...