二叉排序樹的刪除

2021-05-08 09:14:19 字數 1311 閱讀 8480

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

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

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

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 思路 如果targetnode有右子節點 第三種情況 刪除有兩棵子樹的節點 比如 7,3,10 思路 public class binarysorttreedemo bi...

構造二叉排序樹(BST) 二叉排序樹的刪除

主要是刪除操作 include include using namespace std typedef int elementtype typedef struct treenode threadtree void visit treenode node void inorder threadtre...

二叉排序樹的刪除

在二叉排序樹中刪除一結點,要考慮刪除點子樹的情況,在刪除了指定點後,要將其子樹重新鏈結起來,分情況計論,如果想要刪除葉結點,只需將其父結點指向它的指標,指向null,再釋放它即可,如果被刪除結點的右子樹為空,可以拿它的左子樹結點頂替它的位置,再釋放它,如果被刪結點的左子樹為空,可以拿它的右子樹結子頂...