二叉樹的刪除

2021-07-11 06:59:42 字數 1533 閱讀 1589

二叉排序樹的刪除:

對於一般的二叉樹來說,刪去樹中的乙個結點是沒有意義的,因為它將使以被刪除的結點為根的子樹變成森林,破壞了整棵樹的結構

但是,對於二叉排序樹,刪去樹上的乙個結點相當於刪去有序序列中的乙個記錄,只要在刪除某個結點後不改變二叉排序樹的特性即可。

在二叉排序樹上刪除乙個結點的演算法如下:

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.因為我們的二叉樹是單向的,所以我們是判斷當前結點的子結點是否需要刪除...