二叉排序樹的刪除:
對於一般的二叉樹來說,刪去樹中的乙個結點是沒有意義的,因為它將使以被刪除的結點為根的子樹變成森林,破壞了整棵樹的結構
但是,對於二叉排序樹,刪去樹上的乙個結點相當於刪去有序序列中的乙個記錄,只要在刪除某個結點後不改變二叉排序樹的特性即可。
在二叉排序樹上刪除乙個結點的演算法如下:
btree * deletebst(btree *b, elemtype x)
return b;
}
其中刪除過程有兩種方法。
第一種過程如下:
1。若p有左子樹,找到其左子樹的最右邊的葉子結點r,用該葉子結點r來替代p,把r的左孩子
作為r的父親的右孩子。
2。若p沒有左子樹,直接用p的右孩子取代它。
第二種過程如下:
1。若p有左子樹,用p的左孩子取代它;找到其左子樹的最右邊的葉子結點r,把p的右子樹作為r
的右子樹。
2。若p沒有左子樹,直接用p的右孩子取代它。
兩種方法各有優劣,第一種操作簡單一點點,但均衡性不如第二種,因為它將結點p的右子樹
全部移到左邊來了。下面將分別以兩種種思路編寫**。
第一種:
btree * delnode(btree *p)
r->rchild = p->rchild;
btree *q = p->lchild; //q指向其左子樹;
free(p);
return q;
} else
}
第二種:
btree * delnode(btree *p)
if(prer != r)//若r不是p的左孩子,把r的左孩子作為r的父親的右孩子
r->rchild = p->rchild; //被刪結點p的右子樹作為r的右子樹
free(p);
return r;
} else
}
但是上面這種方法,把r移來移去,很容易出錯,其實在這裡我們刪除的只是p的元素值,而不是它的位址,所以完全沒有必要移動指標。仔細觀察,發現我們刪除的位址實際上是p的左子樹的最右邊的葉子結點r的位址,所以我們只要把r的資料填到p中,然後把r刪除即可。
//演算法如下:
btree * delnode(btree *p)
p->data = r->data;
if(prer != r)//若r不是p的左孩子,把r的左孩子作為r的父親的右孩子
prer->rchild = r->lchild;
else
p->lchild = r->lchild; //否則結點p的左子樹指向r的左子樹
free(r);
return p;
} else
}
參考:
二叉樹的刪除
1 如果刪除的節點是葉子節點,則刪除該節點。2 如果刪除的節點是非葉子節點,則刪除該子樹。description 二叉樹實戰 date 2021 3 16 author cakin public class binarytreedemo classname binarytreedemo descri...
二叉樹刪除詳解
二叉查詢樹的刪除過程 假設要刪除樹t中的某節點z,此時對於如何刪除z要分三種情況考慮 1.z無子女 此時直接刪除z即可 z無子女 tree delete0 t,z 2.z有乙個子女 用其子節點代替自己即可 z只有乙個子女 tree delete1 t,z 3.z有兩個子女 刪除z的後繼y y不會有左...
二叉樹刪除結點
二叉樹完成刪除結點的操作.規定 1 如果刪除的節點是葉子節點,則刪除該節點 2 如果刪除的節點是非葉子節點,則刪除該子樹 思路首先先處理 考慮如果樹是空樹root,如果只有乙個root結點,則等價將二叉樹置空 然後進行下面步驟 1.因為我們的二叉樹是單向的,所以我們是判斷當前結點的子結點是否需要刪除...