日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构:二叉查找树(C语言实现)

發布時間:2023/11/29 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构:二叉查找树(C语言实现) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據結構:二叉查找樹

二叉查找樹

基礎知識

  關于二叉樹的基礎知識,請看我的一篇博客:二叉樹的鏈式存儲

?

?

二叉查找樹的特征

  二叉查找樹或者是一棵空樹,或者是具有下列性質的二叉樹:
  1.若其左子樹不空,則左子樹上所有結點的值均小于它的根結點的值;
  2.若其右子樹不空,則右子樹上所有結點的值均大于它的根結點的值;
  3.其左、右子樹也分別為二叉排序樹

?

二叉查找樹的建立

  反復插入節點所構造出來的!若二叉樹為空樹,則插入元素作為樹根節點。若根結點的鍵值等于key,則插入失敗;若key小于根結點的鍵值,則插入到根的左子樹上;否則,插入到根的右子樹上新插入的節點一定是一個葉子節點!

代碼分析

void InsertBST(BiStree &Tree,ElemType e) {BiStree T =Tree; //定義執行副本,!BiStree father =NULL; //定義while (T&&T->data.key!=e.key){father=T;if(e.key>T->data.key)T=T->Rchild;elseT=T->Lchild;}if(T) //跳出循環的只有兩種情況,要么就是T不存在,要么就是找到了對應元素!T 存在說明,只能是對應元素也存在,那我我們就不用插入了return;BiSnode *s = (BiSnode*)malloc(sizeof(BiSnode));//能到這里,說明節點不存在,新建一個節點,并初始化!s->data=e;s->Rchild=s->Lchild=NULL;if(father==NULL) //如果farther不存在,那說明就是沒有執行While語句,也即是樹是空的,因為一旦執行,就不會為NULL!Tree=s;else if(e.key>father->data.key) //到這里說明Farther存在,那么剩下的就是往farther左右節點插入元素了father->Rchild=s;elsefather->Lchild=s; }

  

刪除運算

  刪除運算是的基礎是查找元素,首先要查找要刪除的元素,如果找到就刪除,找不到就不用刪除了。

查找代碼

void DelBST(BiStree &Tree,char key) {if(!Tree) //如果節點為空節點,說明要刪除的元素不可能存在,所以返回就好!return;else //下面是節點存在的分情況判斷:{if(Tree->data.key==key) //如果找到了要刪除的節點!{deleteNode(Tree); //刪除該節點}else if(Tree->data.key<key) //如果要刪除的節點大于該節點,則往該節點的右子樹方向進行查找DelBST(Tree->Rchild,key);elseDelBST(Tree->Lchild,key);//如果要刪除的節點小于該節點,則往該節點的左子樹方向進行查找} }

  到現在我們已經找到元素了 ,要對其刪除,就是要實現deleteNode(Tree);方法!
  但是刪除元素的運算是存在多種情況的,我們要分別處理:
    ★待刪除的結點*p是個葉子結點

  

    ★待刪除的結點*p是僅有一個非空子樹

  

    ★待刪除的結點*p有兩個非空子樹

  

    如何找出直接前驅:找到要刪除節點的第一個左子樹然后一直向右!   

刪除代碼

void deleteNode(BiStree &p) {if(!p->Rchild) //對第一種及第二種情況的處理{BiSnode * q =p;p=p->Lchild;free(q);}else if(!p->Lchild) //對第一種及第二種情況的處理{BiSnode * q =p;p=p->Rchild;free(q);} else{BiSnode * q =p;BiSnode * s =p->Lchild;while (s->Rchild){q=s;s=s->Rchild;}//s指向被刪節點p的前驅p->data=s->data;if(q!=p) //詳見下兩圖q->Rchild=s->Lchild; //左圖elseq->Lchild=s->Lchild; //右圖free(s);}}

    

轉載于:https://www.cnblogs.com/MrSaver/p/6087402.html

總結

以上是生活随笔為你收集整理的数据结构:二叉查找树(C语言实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。