西叶胡杨 2021-11-16 20:07 采纳率: 33.3%
浏览 16
已结题

数据结构删除节点有点问题

有朋友能帮我看看这个删除节点的函数有什么问题吗?我测试目前只有被删除节点有左右子树的情况有问题

//这是删除节点的函数
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;
}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 11月24日
    • 创建了问题 11月16日

    悬赏问题

    • ¥15 Opencv配置出错
    • ¥15 模电中二极管,三极管和电容的应用
    • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
    • ¥15 气象网格数据与卫星轨道数据如何匹配
    • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
    • ¥15 微软账户问题不小心注销了好像
    • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
    • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
    • ¥20 关于web前端如何播放二次加密m3u8视频的问题
    • ¥15 使用百度地图api 位置函数报错?