學習二叉搜尋樹的過程中,對於刪除操作中的兩個節點都存在的情況進行**編寫時,出現了疑惑,所以我著重講解一下刪除操作**。
首先進行資料的宣告:
#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有右孩子時
2.當p是q的右孩子,並且p有右孩子時, 3.當p是q的左孩子,並且p有左孩子時, 4.當p是q的右孩子,並且p有左孩子時, (3)當刪除的節點有左右兩個子節點時,else if( !p->rchild || !p->lchild ) //其中乙個子節點為空
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語言搜尋二叉樹
今天和大家分享乙個二叉搜尋樹的實現演算法,二叉搜尋樹是若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值,如下圖 為了能讓這個樹更加完整,不那麼散亂,我將他包裝起來成為一棵樹,然後想,一棵樹裡要寫啥,那肯定是要乙個根節點啦,於是...