對于二叉搜索樹,我們如果要刪除一個節點,需要我們比較左右節點大小來找到這個節點,然后再有三種情況,無孩子,一個孩子,兩個孩子。但是,如果針對任意的二叉樹(非二叉搜索樹),那么如果要刪除任意數據,應該怎么C代碼實現呢?我自己寫了一個,不知可不可行,大神來給意見吶!以下是刪除功能的代碼struct?Node?*Find(struct?Node?*root)
{
while?(root?->?left?!=?NULL)?root?=?root?->?left;
return?root;
}
struct?Node?*Delete(struct?Node?*root,?int?data)
{
if?(root?==?NULL)?return?root;
if?(root?->?data?!=?data)?
{
root?->?left?=?Delete(root?->?left,?data);
root?->?right?=?Delete(root?->?right,?data);
}
//wohoo....i?found?you,get?ready?to?delete!
else
{
????????//case?1?:?no?child
if?(root?->?left?==?NULL?&&?root?->?right?==?NULL)
{
free(root);//C++?-->?delete?root;
root?=?NULL;
}
//case?2?:?one?child
else?if?(root?->?left?==?NULL)
{
struct?Node?*temp?=?root;
root?=?root?->?right;
free(temp);//C++?-->?delete?root;
}
else?if?(root?->?right?==?NULL)
{
struct?Node?*temp?=?root;
root?=?root?->?left;
free(temp);//C++?-->?delete?root;
}
else//case?3?:?two?children
{
struct?Node?*temp?=?Find(root);//find?a?data?to?replace?this?deleted?data
root?->?data?=?temp?->?data;
root?->?left?=?Delete(root?->?left,?temp?->?data);//Delete?the?data?I?found?on?the?left
}
}
return?root;
}
- 0 回答
- 0 關注
- 1629 瀏覽
添加回答
舉報
0/150
提交
取消