BiTree &T 和 Bitree T 和 BitNode *T 和 T->lchild

本文详细解析了二叉搜索树中元素插入的具体实现过程,包括如何通过指针操作来实现新节点的正确放置,并解释了代码中使用引用传递的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

typedef struct BitNode{
    int data;
    BitNode *lchild,*rchild;
}BitNode,*BiTree;

typedef有取别名的作用,所以BitNode的意思是struct BitNode{...),BiTree的意思是struct BitNode{...)*。

BiTree &T 是取指针地址的意思,如同int  &a,取a得地址一样。

BitNode *T  和  BiTree T 是定义结构指针变量。

有这种函数

       int insertBST(BiTree &T, int e) {
    BiTree p;
    if (!searchBST(T, e, NULL, p)) {
        BiTree s = (BiTree)malloc(sizeof(BitNode));
        s->data = e;
        s->lchild = s->rchild = NULL;
        if(!p)    
            T = s;
        else if LT(e, p->data)    p->lchild = s;
        else    p->rchild = s;
        return TRUE;
    }
    else    return FLASE;
}


它的参数是BiTree &T,这是为了对指针进行修改,而修改一个值,则必须知道它的地址,所以的取指针地址的地址,类似于int a,通过函数修改a,则需int local(int &a),一个道理。你也可以写成int insertBST(BitNode *(&T), int e),那么函数里面的 T->lchild,T->rchild,T->data是做什么的?它们在修改这个T指针,你的T指针一直是NULL,而你让它指向了(BiTree)malloc(sizeof(Node))这个空间!!!即一直在修改这个T指针,调试时你会发现你的T的地址发生了变化。那么你说你是不是要用他的引用啊!

#include<stdio.h> #include<stdlib.h> typedef struct BiTNode { int key; struct BiTNode *lchild, *rchild; } BiTNode, *BiTree; int SearchBST(BiTree T, int key, BiTree f, BiTree &p) { if (!T) { p = f; return 0; } else if (key == T->key) { p = T; return 1; } else if (key < T->key) SearchBST(T->lchild, key, T, p); else SearchBST(T->rchild, key, T, p); } int InsertBST(BiTree &T, int key) { if (!T) { T = (BiTree)malloc(sizeof(BiTNode)); T->key = key; T->lchild = (T)->rchild = NULL; } if (key == T->key) return 0; if (key > T->key) InsertBST(T->rchild, key); else InsertBST(T->lchild, key); } void InorderTraverse(BiTree T) { if (T){ InorderTraverse(T->lchild); printf("%d ", T->key); InorderTraverse(T->rchild); } } void Delete(BiTree &p) { BiTree q, s; if (!p->lchild && !p->rchild) p = NULL; else if (!p->lchild) { q = p; p = p->rchild; free(q); } else if (!p->rchild) { q = p; p = p->lchild; free(q); } else{ q = p; s = p->lchild; while (s->rchild) { q = s; s = s->rchild; } p->key = s->key; if (q != p) q->rchild = s->lchild; else q->lchild = s->lchild; free(s); } } int DeleteBST(BiTree &T, int key) { if (!T) return 0; else{ if (key == T->key) Delete(T); else if (key < T->key) DeleteBST(T->lchild, key); else DeleteBST(T->rchild, key); } } int main() { int e, n; BiTree T = NULL, f = 0, p; printf("输入长度:"); scanf("%d", &n); printf("输入元素:"); while (n--){ scanf("%d", &e); InsertBST(T, e); } printf("中序遍历:"); InorderTraverse(T); printf("\n"); while (1) { printf("输入要查找元素:"); scanf("%d", &e); if (SearchBST(T, e, f, p)) printf("找到了\n"); else printf("没找到\n"); printf("输入要插入元素:"); scanf("%d", &e); InsertBST(T, e); printf("中序遍历:"); InorderTraverse(T); printf("\n"); printf("输入要删除元素:"); scanf("%d", &e); DeleteBST(T, e); printf("中序遍历:"); InorderTraverse(T); printf("\n"); } }请帮我注视本段代码
06-07
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值