對(duì)于二叉搜索樹(shù),我們?nèi)绻獎(jiǎng)h除一個(gè)節(jié)點(diǎn),需要我們比較左右節(jié)點(diǎn)大小來(lái)找到這個(gè)節(jié)點(diǎn),然后再有三種情況,無(wú)孩子,一個(gè)孩子,兩個(gè)孩子。但是,如果針對(duì)任意的二叉樹(shù)(非二叉搜索樹(shù)),那么如果要?jiǎng)h除任意數(shù)據(jù),應(yīng)該怎么C代碼實(shí)現(xiàn)呢?我自己寫了一個(gè),不知可不可行,大神來(lái)給意見(jiàn)吶!以下是刪除功能的代碼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 關(guān)注
- 1608 瀏覽
添加回答
舉報(bào)
0/150
提交
取消