1、先定義乙個二叉樹節點:
templateclass treenode
treenode(t ele)
};
2、再進行二叉樹的插入以建立乙個二叉樹:若二叉樹為空,直接建立根節點儲存資料即可;若不為空,當新元素小於父節點時,根據二叉搜尋樹特點,需要作為父節點左子樹,反之作為右子樹:
bool insert(t ele)//新元素小於父節點,則做父節點左孩紙
else if(ele>p->ele)//新元素大於父節點,則做父節點右邊孩紙
else return false;}
if(eleele)parent->left=new treenode(ele);
else parent->right=new treenode(ele);
}size++;
return true;}
3、進行二叉樹的刪除:總體思想:分多種情況討論
1.被刪除節點沒有子樹的情況,直接刪除,並修改對應父節點的指標為空。
2.對於只有乙個子樹的情況,考慮將其子樹作為其父節點的子樹,關於是左還是右,根據被刪除的節點確定。
3.最複雜的是有兩個子數的情況,可以考慮兩種方法,都是同樣的思想:用被刪除節點a的左子樹的最右節點或者a的右子樹的最左節點作為替代a的節點,並修改相應的最左或最右節點的父節點的指標,修改方法類似2 ,不做細緻討論
如果,是空樹返回
否則否則,如果,p的左孩子節點為空,右孩子節點非空
否則,如果p的左孩子節點非空,右孩子節點為空
否則,如果,p的左右孩子都不空
否則,如果,p的左孩子節點右孩子節點為空,左孩子節點非空
否則,如果,p的左孩子節點的左孩子節點為空,右孩子節點為非空}}
遞迴的刪除左右孩子節點
講解之前我先把查詢的**附上,以為刪除過程需要用到這段兒查詢的**:
treenode* search_node(t ele)
treenode* search_node(t ele,treenode*root)
else if(eleele)
return search_node(ele,root->left);
else return search_node(ele,root->right);}
if(f==0)return null;}}
首先第一種情況:
(刪除沒有子節點的節點)
刪除沒有子節點的節點只需要將被刪除節點的父節點指向空即可
treenode*pa=null;
treenode*p=root;
if(root==null) throw runtime_error("empty");
if(p->left==null&&p->right==null)}//p是右子樹,右子樹置空
第二種情況:(刪除只有乙個子節點的節點)
刪除有乙個子節點的節點,只需要將被刪除節點的父節點指向刪除節點的子節點即可
//刪除的節點只含右節點
//刪除的節點只含右節點
if(p->left==null&&p->right!=null)//當前節點是普通父節點的
//如果要刪除的節點只有左節點
if(p->left!=null&&p->right==null)
第三種情況:(刪除有兩個子節點的節點,即左右子樹都非空)
刪除有兩個子節點的節點,到底誰來替代被刪除的節點的位置呢?是左節點,還是右節點,代替以後這個子節點的子節點應該怎麼安排?一系列的問題都出來了。。。簡便的方法就是要找乙個節點代替這個被刪除的節點,這就要從二叉搜尋樹的定義來看。因為二叉搜尋樹是有序的,我們要找的節點在這棵樹上,而且這個節點要比被刪除的左節點大,比右節點小。先看看這個已被刪除節點的右節點為根的子樹的所有節點的值都要比被刪除節點大,這是二叉搜尋樹定義的,但是要在這個集合中找到最小的乙個,來代替被刪除的節點,那就要在這棵子樹上一直往左找。這個節點比被刪除的節點的右節點小,且比左節點大,那這個節點就叫做被刪除節點的後繼節點,用這個節點來代替被刪除節點。也就是說用被刪除節點a的左子樹的最右節點或者a的右子樹的最左節點作為替代a的節點,並修改相應的最左或最右節點的父節點的指標。
// 如果要刪除的節點有兩個子節點,即左右子節點都非空
// 方法是用要刪除的節點的後續節點代替要刪除的節點,並且刪除後續節點(刪除後續節點的時候同樣的遞迴操作)
// 其實,這裡要用到的最多也就會發生兩次,即後續節點不會再繼續遞迴的刪除下乙個後續節點了
// 因為,要刪除的節點的後續節點肯定是 要刪除的那個節點的右子樹的最小關鍵字,而這個最小關鍵字肯定不會有左節點
// 所以,在刪除後續節點的時候肯定不會用到( 兩個節點都非空的判斷 ),如有有子節點,肯定就是有乙個右節點。
if(p->left!=null&&p->right!=null)//獲取後續點
p->ele=child->ele;
if(parent->left==child)
parent->left=child->left;
else
parent->right=child->left;
delete(child);
}}
綜述:
void deleteele(treenode*current)
//刪除的節點只含右節點
if(p->left==null&&p->right!=null)
//如果要刪除的節點只有左節點
if(p->left!=null&&p->right==null)
// 如果要刪除的節點有兩個子節點,即左右子節點都非空
// 方法是用要刪除的節點的後續節點代替要刪除的節點,並且刪除後續節點(刪除後續節點的時候同樣的遞迴操作)
// 其實,這裡要用到的最多也就會發生兩次,即後續節點不會再繼續遞迴的刪除下乙個後續節點了
// 因為,要刪除的節點的後續節點肯定是 要刪除的那個節點的右子樹的最小關鍵字,而這個最小關鍵字肯定不會有左節點
// 所以,在刪除後續節點的時候肯定不會用到( 兩個節點都非空的判斷 ),如有有子節點,肯定就是有乙個右節點。
二叉樹節點的刪除
昨天在看書的時候,突然看到二叉查詢樹的刪除,以前學過,不過學的不仔細,結果研究了一晚上,才把二叉樹的刪除操作給整出來。唉,以後看書要仔細啊。先說一下如何刪除二叉樹查詢樹的節點吧。總共有三種情況 1.被刪除的節點是葉子節點,這時候只要把這個節點刪除,再把指向這個節點的父節點指標置為空就行 2.被刪除的...
二叉樹節點的刪除
昨天在看書的時候,突然看到二叉查詢樹的刪除,以前學過,不過學的不仔細,結果研究了一晚上,才把二叉樹的刪除操作給整出來。唉,以後看書要仔細啊。先說一下如何刪除二叉樹查詢樹的節點吧。總共有三種情況 1.被刪除的節點是葉子節點,這時候只要把這個節點刪除,再把指向這個節點的父節點指標置為空就行 2.被刪除的...
紅黑二叉樹節點的插入
進行紅黑樹節點的插入時候我們必須結合紅黑樹的性質,要不是真的很容易忙半天卻發現寫的 漏洞百出不符合紅黑樹的性質 每個結點不是紅色就是黑色 根節點是黑色的 如果乙個節點是紅色的,則它的兩個孩子結點是黑色的 對於每個結點,從該結點到其所有後代葉結點的簡單路徑上,均 包含相同數目的黑色結點 每個葉子結點都...