二叉搜尋樹(C語言)

2021-08-03 02:42:31 字數 2740 閱讀 3784

學習二叉搜尋樹的過程中,對於刪除操作中的兩個節點都存在的情況進行**編寫時,出現了疑惑,所以我著重講解一下刪除操作**。

首先進行資料的宣告:

#include#includetypedef int data_type;      //宣告元素型別

typedef struct bst_nodebst_t,*bst_p;

傳入根節點root與進行比較的值data

bst_p position_insert(bst_p *root,data_type key)        //找到要插入的值的位置

return s;

}

bst_p insert_node(bst_p *root, data_type data)          //進行插入操作}}

bst_p search_node( bst_p *root, data_type data )         //查詢數值是否在樹中

return null;

}

首先我放一下完整的**,稍後說明我的理解:

刪除操作主要分為三種,

(1)第一種是刪除的是子節點

(2)第二種是刪除的節點左右子節點其中有乙個存在

(3)第三種是左右兩個節點都存在

bool delete_node(bst_p *root,data_type data)            //宣告乙個q節點,q節點是p節點的父節點

while(p && !sign) //尋找該節點

else

}if(sign == false)

if( p->lchild == null && p->rchild == null ) //兩個子節點都為空,直接刪除

else if( !p->rchild || !p->lchild ) //其中乙個子節點為空

else if(q->rchild == p && p->rchild)

else if(q->lchild == p && p->lchild)

else if(q->rchild ==p && p->lchild)

}else//兩個字節點都不為空

p->data = s->data; //節點s的值賦給節點p的值

if(t == p)

else

free(s);

free(t);

return true;}}

這段**主要說的是查詢要刪除的節點,並保留節點p的父節點,保留父節點主要是考慮到第三種情況,再刪除節點時需要用到父節點進行賦值

while(p && !sign)   //尋找該節點

else

}

(1)刪除子節點

if( p->lchild == null && p->rchild == null )    //兩個子節點都為空,直接刪除

(2)刪除節點中子節點有乙個存在

1.這裡用到了父節點q,我們在進行刪除時,當p是q的左孩子,並且p有右孩子時

else if( !p->rchild || !p->lchild )       //其中乙個子節點為空

2.當p是q的右孩子,並且p有右孩子時,

3.當p是q的左孩子,並且p有左孩子時,

4.當p是q的右孩子,並且p有左孩子時,

(3)當刪除的節點有左右兩個子節點時,

else//兩個字節點都不為空

p->data = s->data; //節點s的值賦給節點p的值

if(t == p)

p->lchild = s->lchild;

else

t->rchild = s->lchild;

free(s);

free(t);

return true;

}

C語言 二叉搜尋樹

實現過程 二叉查詢樹 binary search tree 又 二叉搜尋樹,二叉排序樹 它或者是一棵空樹,或者是具有下列性質的二叉樹 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 它的左 右子樹也分別為二叉排序樹。簡而言之...

C語言二叉搜尋樹

7 4 是否同一棵二叉搜尋樹 25 分 給定乙個插入序列就可以唯一確定一棵二叉搜尋樹。然而,一棵給定的二叉搜尋樹卻可以由多種不同的插入序列得到。例如分別按照序列和插入初始為空的二叉搜尋樹,都得到一樣的結果。於是對於輸入的各種插入序列,你需要判斷它們是否能生成一樣的二叉搜尋樹。輸入包含若干組測試資料。...

C語言搜尋二叉樹

今天和大家分享乙個二叉搜尋樹的實現演算法,二叉搜尋樹是若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值,如下圖 為了能讓這個樹更加完整,不那麼散亂,我將他包裝起來成為一棵樹,然後想,一棵樹裡要寫啥,那肯定是要乙個根節點啦,於是...