在刪除前,遍歷程序運(yùn)行正常。單獨(dú)運(yùn)行刪除程序也不報(bào)錯(cuò)。但是如果在刪除后遍歷,程序就會(huì)陷入無(wú)限循環(huán),報(bào)錯(cuò)退出。是否在Delete函數(shù)的最后的delete使用不當(dāng)?如果不用delete,直接把刪除節(jié)點(diǎn)置空,就無(wú)法刪除節(jié)點(diǎn)。應(yīng)該怎么處理?可能這個(gè)問(wèn)題有點(diǎn)簡(jiǎn)單,希望大家?guī)臀医鉀Q一下。接觸c語(yǔ)言時(shí)間不長(zhǎng),程序書寫過(guò)程中有哪些問(wèn)題,如果大家發(fā)現(xiàn)了也可以和我說(shuō)一下,感謝。
#include<stdio.h>
#include<stdlib.h>
typedef struct TreeNode{
int data;
struct TreeNode *left;
struct TreeNode *right;
}ST,*PST;
void InitTree(PST &T)
{
T = NULL;
}
PST Insert(PST &T,int e)
{
if (T==NULL)
{
T = (PST)malloc(sizeof(ST));
if(T==NULL)
{printf("Wrong!");return NULL;}
else
{
T->data = e;
T->left = T->right = NULL;
}
}
else if (e<T->data)
T->left = Insert(T->left,e);
else
T->right = Insert(T->right,e);
return T;
}
void CreateTree(PST &T){
int i,num,elem;
printf("Please enter the number of the nodes in your tree:");
scanf("%d",&num);
for(i=0;i<num;i++)
{
scanf("%d",&elem);
T = Insert(T,elem);
}
}
PST Find(PST T,int e)
{
if(T==NULL) return NULL;
if (T->data == e)
return T;
else if (e<T->data)
return Find(T->left,e);
else if (e>T->data)
return Find(T->right,e);
return NULL;
}
PST FindMax(PST T)
{
while(T->right != NULL)
T = T->right;
return T;
}
PST FindMin(PST T)
{
while(T->left != NULL)
T = T->left;
return T;
}
PST Delete(PST &T,int e)
{
PST new_one;
if (T==NULL) return NULL;
else if (e<T->data)
T->left = Delete(T->left,e);
else if (e>T->data)
T->right = Delete(T->right,e);
else if (T->left&&T->right)
{
new_one = FindMin(T->right);
T->data = new_one->data;
T->right = Delete(T->right,T->data);
}
else
{
new_one = T;
if(T->left) T=T->left;
else if (T->right) T = T->right;
delete new_one;
new_one = NULL;
}
return T;
}
void PrintT(PST T){
if(T!=NULL)
{
printf("%-3d",T->data);
PrintT(T->left);
PrintT(T->right);
}
}
int main()
{
PST BigTree;
InitTree(BigTree);
CreateTree(BigTree);
PrintT(BigTree);
Find(BigTree,7);
Delete(BigTree,7);
PrintT(BigTree);
return 0;
}
這樣改也是無(wú)法刪除節(jié)點(diǎn),但能正常遍歷:
PST Delete(PST &T,int e)
{
PST new_one;
if (T==NULL) return NULL;
else if (e<T->data)
T->left = Delete(T->left,e);
else if (e>T->data)
T->right = Delete(T->right,e);
else if (T->left&&T->right)
{
new_one = FindMin(T->right);
T->data = new_one->data;
T->right = Delete(T->right,T->data);
}
else
{
new_one = T;
if(T->left) T=T->left;
else if (T->right) T = T->right;
new_one = NULL;
delete new_one;
}
return T;
}
上面的答案說(shuō)的沒(méi)錯(cuò),沒(méi)有考慮左右都是空的情況,可以參考下面的代碼:
template<typename T>
bool BTree<T>::deleteNode(const T &value, Node *&node) {
if (node == nullptr) {
return false;
} else if (value < node->value) {
return deleteNode(value, node->left);
} else if (value > node->value) {
return deleteNode(value, node->right);
} else {
if (node->left == nullptr && node->right == nullptr) {
delete node;
node = nullptr;
} else if (node->left == nullptr) {
Node *t = node;
node = node->right;
delete t;
} else if (node->right == nullptr) {
Node *t = node;
node = node->left;
delete t;
} else {
Node *to_del = node->left, *before = node;
while (to_del->right != nullptr) {
before = to_del;
to_del = to_del->right;
}
if (before == node) {
delete node;
node = to_del;
} else {
node->value = to_del->value;
before->right = to_del->left;
delete to_del;
}
}
return true;
}
}
這是我以前寫的刪除二叉樹節(jié)點(diǎn)的的代碼。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過(guò)二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。