刪除二叉搜尋樹中的某個結點

2021-08-15 22:18:25 字數 1387 閱讀 7020

刪除操作的原型為 int deletebstree(pnode* proot, int data),返回型別int用來表示刪除是否成功,其中pnode表示如下

typedef int datatype;

typedef struct bstreenode

node, *pnode;

刪除操作的原理為:首先在二叉搜尋樹中查詢值為data的結點,如果不存在,則返回,否則將待刪除的結點分為以下四種情況:

待刪除的結點無孩子結點

待刪除的結點只有左孩子

待刪除的結點只有右孩子

待刪除的結點有左孩子和右孩子

其中情況1可歸類到2或3。

相應的方法如下:

直接刪除該結點

刪除該結點並使該結點的雙親結點指向該結點的左孩子結點

刪除該結點並使該結點的雙親結點指向該結點的右孩子結點

在該結點的右子樹中尋找關鍵碼(值)最小的結點,將關鍵碼最小的結點的值賦給該結點,然後再刪除關鍵碼最小的結點

對於情況2.待刪除的結點只有左孩子

又可分為如下3種情況,

b和c的不同在於結點1是其雙親的左孩子結點,而結點2是其雙親的右孩子結點。而對於根結點5,若刪除則需改變外部指向搜尋二叉樹的指標。情況3和情況2類似。

而對於情況4.待刪除的結點有左孩子和右孩子,刪除某個結點後必須使剩下二叉樹的仍然具有搜尋二叉樹的性質。

具體**如下:

int deletebstree(pnode* proot, int data)

else

}if (null == pcur)

return 0;

//2.刪除結點

//待刪除結點只有左孩子 || 葉子結點

if (null == pcur->_right)

else

}//只有右孩子

else if (null == pcur->_left)

else

}//待刪除結點有左子樹和右子樹

else

pcur->_data = pdel->_data;

if (pdel == pparent->_left)

pparent->_left = pdel->_right;

else

pparent->_right = pdel->_right;

} free(pdel);

return 1;

}

二叉搜尋樹的建立 新增結點 刪除結點

bst t create void insert bst t tree,char key 小駝峰命名法 好習慣 建立新結點 treenode t newnode calloc 1,sizeof treenode t 用calloc好可以直接初始化為null,因為tree的左右子樹需要判斷是否為nul...

二叉搜尋樹 刪除二叉搜尋樹中的節點

這裡就把平衡二叉樹中刪除節點遇到的情況都搞清楚。第一種情況 沒找到刪除的節點,遍歷到空節點直接返回了 找到刪除的節點 第二種情況 左右孩子都為空 葉子節點 直接刪除節點,返回null為根節點 第三種情況 刪除節點的左孩子為空,右孩子不為空,刪除節點,右孩子補位,返回右孩子為根節點 第四種情況 刪除節...

二叉搜尋樹的刪除 二叉樹 搜尋樹中的刪除操作

二叉搜尋樹刪除節點就涉及到結構調整了。給定乙個二叉搜尋樹的根節點 root 和乙個值 key,刪除二叉搜尋樹中的 key 對應的節點,並保證二叉搜尋樹的性質不變。返回二叉搜尋樹 有可能被更新 的根節點的引用。一般來說,刪除節點可分為兩個步驟 首先找到需要刪除的節點 如果找到了,刪除它。說明 要求演算...