有朋友能帮我看看这个删除节点的函数有什么问题吗?我测试目前只有被删除节点有左右子树的情况有问题
//这是删除节点的函数
void DeleteNode(TreeNode* &T, int elem,TreeNode *Head) {
if (T == NULL) return;
if (T->Data != elem) {
DeleteNode(T->Left, elem,Head);
DeleteNode(T->Right, elem,Head);
}
else{
//若左右子树都存在
if (T->Left&& T->Right) {
TreeNode* FindMin = T->Right;
while (FindMin->Left != NULL) {
FindMin = FindMin->Left;
}
T->Data = FindMin->Data; //将右子树最小值赋给删除结点
TreeNode *Father=FindFather(Head,FindMin->Data);
if(FindMin->Right!=NULL) Father->Left=FindMin->Right; //若FindMin存在右子树,则将其连在父节点的左子树上
else Father->Left=NULL; //否则父节点左孩子赋空
free(FindMin);
}
//若左右子树都为空
else if(T->Left==NULL&& T->Right==NULL){
TreeNode *Father=FindFather(Head,T->Data);
if(Father->Data>T->Data) Father->Left=NULL;//父节点子树赋空
else Father->Right=NULL;
free(T);
}
//若左子树为空
else if (T->Left==NULL) {
T->Data = T->Right->Data;
T->Right=NULL;
free(T->Right);
}
//若右子树为空
else if (!T->Right) {
T->Data = T->Left->Data;
T->Left=NULL;
free(T->Left);
}
}
}
这是我整个程序的内容
#include<iostream>
#include<cstdlib>
using namespace std;
typedef struct TreeNode{
int Data;
TreeNode* Left;
TreeNode* Right;
};
void InsertTree(TreeNode*& T, int elem) {
if (T == NULL) {
T = new TreeNode;
T->Data = elem;
T->Left = T->Right = NULL;
}
else {
if (T->Data == elem) return;
else if (elem < T->Data) InsertTree(T->Left, elem);
else if (elem > T->Data) InsertTree(T->Right, elem);
}
}
void CreateTree(TreeNode*& T) {
int InsertNum = 0;
cout << "Input the number that you want to insert: ";
cin >> InsertNum;
int ins, i;
for (i = 0; i < InsertNum; i++) {
cin >> ins;
InsertTree(T, ins);
}
}
void PreOrderTraverse(TreeNode* T) {
if (T) {
cout << T->Data << " ";
PreOrderTraverse(T->Left);
PreOrderTraverse(T->Right);
}
}
void InOrderTraverse(TreeNode* T) {
if (T) {
InOrderTraverse(T->Left);
cout << T->Data << " ";
InOrderTraverse(T->Right);
}
}
void PostOrderTraverse(TreeNode* T) {
if (T) {
PostOrderTraverse(T->Left);
PostOrderTraverse(T->Right);
cout << T->Data << " ";
}
}
int Height(TreeNode* T) {
int m, n; m = n = 0;
if (T == NULL) return 0;
else {
m = Height(T->Left); //左子树高度
n = Height(T->Right); //右子树高度
if (m > n) return m + 1;
else return n + 1;
}
}
int NodeNum(TreeNode* T) {
if (!T) return 0;
else return (NodeNum(T->Left) + NodeNum(T->Right) + 1);
}
TreeNode* FindFather(TreeNode *&T,int elem){
if (T == NULL) return NULL;
if(((T->Left)&&(T->Left->Data==elem))||((T->Right)&&(T->Right->Data==elem))){
return T;
}
else{
TreeNode* q,*p;
q=FindFather(T->Left,elem);
p=FindFather(T->Right,elem);
return q?q:p;
}
}
void DeleteNode(TreeNode* &T, int elem,TreeNode *Head) {
if (T == NULL) return;
if (T->Data != elem) {
DeleteNode(T->Left, elem,Head);
DeleteNode(T->Right, elem,Head);
}
else{
//若左右子树都存在
if (T->Left&& T->Right) {
TreeNode* FindMin = T->Right;
while (FindMin->Left != NULL) {
FindMin = FindMin->Left;
}
T->Data = FindMin->Data; //将右子树最小值赋给删除结点
TreeNode *Father=FindFather(Head,FindMin->Data);
if(FindMin->Right!=NULL) Father->Left=FindMin->Right; //若FindMin存在右子树,则将其连在父节点的左子树上
else Father->Left=NULL; //否则父节点左孩子赋空
free(FindMin);
}
//若左右子树都为空
else if(T->Left==NULL&& T->Right==NULL){
TreeNode *Father=FindFather(Head,T->Data);
if(Father->Data>T->Data) Father->Left=NULL;//父节点子树赋空
else Father->Right=NULL;
free(T);
}
//若左子树为空
else if (T->Left==NULL) {
T->Data = T->Right->Data;
T->Right=NULL;
free(T->Right);
}
//若右子树为空
else if (!T->Right) {
T->Data = T->Left->Data;
T->Left=NULL;
free(T->Left);
}
}
}
int main() {
TreeNode* T = NULL;
CreateTree(T);
cout<<"先序遍历结果: ";PreOrderTraverse(T); cout<<endl;
cout <<"二叉树高度为: "<< Height(T) << endl;
cout << "二叉树节点个数为: "<<NodeNum(T) << endl;
system("pause");
//TreeNode *Father=FindFather(T,22); cout<<Father->Data; free(Father);
TreeNode *Head=T;
DeleteNode(T,25,Head);
cout<<"先序遍历结果: ";PreOrderTraverse(T); cout<<endl;
return 0;
}