为什么这样写二叉查找树的删除操作是错误的呢?

这样写的二叉查找树的删除操作中,当删除节点左右子树都存在时,为什么这样写只是删除了左子树的最右结点,却没有把左子树的最右结点放到删除位置上去呢?


```c++
.h

#ifndef TREE_SORT_H_H_INCLUDED
#define TREE_SORT_H_H_INCLUDED

#include 
#include 

using namespace std;

typedef struct Tree
{
    int weight;
    struct Tree* left,*right;
}Tree,*pTree;

void initTree(pTree& pT,int w)
{
    pT=new Tree;

    if(pT==NULL)
    {
        cout<<"内存分配失败!"<return;
    }

    pT->weight=w;
    pT->left=pT->right=NULL;
}

void buildTree(pTree& pT,int w)
{
    if(!pT)
        initTree(pT,w);
    else if(wweight)
        buildTree(pT->left,w);
    else if(w>pT->weight)
        buildTree(pT->right,w);
}

void createTree(pTree& pT,int w[],int n)
{
    for(int i=0;ivoid dfs(pTree pT,int x)
{
    if(pT==NULL)
        return;

    if(x==0) cout<" "<weight<<" ";
    dfs(pT->left,x);

    if(x==1) cout<" "<weight<<" ";
    dfs(pT->right,x);

    if(x==2) cout<" "<weight<<" ";
}

void deleteTree(pTree& pT,int w)
{
    pTree p=pT,q=pT,f=NULL;

    //找到删除节点
    while(p && p->weight!=w)
    {
        //f为删除节点的直接前驱
        f=p;
        q=p;

        if(p->weight>w)
            p=p->left;

        if(p->weightright;
    }

    if(p==NULL)
    {
        cout<<"删除元素在二叉搜索树中不存在!"<return;
    }

    pTree t=p;

    //当该结点左右子树都存在的时候,则寻找左子树的最右结点取代该删除结点
    if(p->left && p->right)
    {
        //必须从删除结点的左子树开始找起!
        pTree l=p->left;
        while(l->right!=NULL)
        {
            //更新t来记录最右结点的前驱节点
            t=l;
            l=l->right;
        }

        p=l;
//        if(q->left==p)
//        {
//            q->left=l;
//            q->left->left=p->left;
//            q->left->right=p->right;
//        }
//        else
//        {
//             q->right=l;
//             q->right->left=p->left;
//             q->right->right=p->right;
//        }

        cout<<"p="<"l="<//判断左子树的最右节点直接前驱是否为该删除节点
        //若不为该删除节点,则将最右结点的左子树接到该直接前驱的右边
        //若为该删除节点,则直接将左右节点的左子树接到最右结点直接前驱的左边
        if(t!=p)
            t->right=l->left;
        else
            t->left=l->left;

        cout<<"左右子树都存在,操作完成!"<return;
    }
    //当该结点无左子树,则直接将右子树接过来
    else if(p->left==NULL)
    {
        cout<<"左子树不存在,直接将右子树接到该删除节点!"<right;
    }
    //当该结点无右子树,则直接将左子树接过来
    else if(p->right==NULL)
    {
        cout<<"右子树不存在,直接将左子树接到该删除节点!"<left;
    }

    if(f==NULL)
        pT=p;
    else if(t==f->right)
        f->right=p;
    else
        f->left=p;

    //不应该删除p,因为p已经是接完之后的结点
    //delete p;

    //删除t纯属是为了释放内存
    delete t;
}
#endif // TREE_SORT_H_H_INCLUDED

.c

#include 
#include "tree_sort_h.h"

using namespace std;

int main()
{
    cout<<"请输入需要输入的节点总数:"<int n;
    cin>>n;

    int val[10]={89,99,90,14,68,98,97,100,19,79};
//    int val[100];
//    for(int i=0;i
//    {
//        cout<<"请输入该节点的数据为:"<
//        cin>>val[i];
//    }

    pTree pT=NULL;
    createTree(pT,val,n);

    cout<<"创建二叉搜索树后的遍历为:"<for(int i=0;i<3;i++)
    {
        dfs(pT,i);
        cout<//deleteTree(pT,90);
    deleteTree(pT,99);
    //deleteTree(pT,1000);

    cout<<"删除操作后的二叉搜索树为:"<for(int i=0;i<3;i++)
    {
        dfs(pT,i);
        cout<return 0;
}