数据结构之二叉树的创建与遍历(七)

#include <stdio.h>
#include <stdlib.h>

/*
    A
B       C
     D
        E
 */

typedef struct BTNode
{
    int data;
    struct BTNode * pLeftChild;
    struct BTNode * pRightChild;
}BTNODE, *PBTNODE;

PBTNODE createBTree(void);
//先序遍历,其他的一样
void showPreTree(PBTNODE);

int main(void) {
    
    PBTNODE pTree = createBTree();
    showPreTree(pTree);
    
    return 0;
}

void showPreTree(PBTNODE pTree)
{
    if (pTree != NULL) {
        printf("%c\n", pTree->data);
        if (pTree->pLeftChild != NULL) {
            showPreTree(pTree->pLeftChild);
        }
        
        if (pTree->pRightChild != NULL) {
            showPreTree(pTree->pRightChild);
        }
    }
}

PBTNODE createBTree(void)
{
    //创建5个d节点
    PBTNODE PNodeA = (BTNODE *)malloc(sizeof(BTNODE));
    PBTNODE PNodeB = (BTNODE *)malloc(sizeof(BTNODE));
    PBTNODE PNodeC = (BTNODE *)malloc(sizeof(BTNODE));
    PBTNODE PNodeD = (BTNODE *)malloc(sizeof(BTNODE));
    PBTNODE PNodeE = (BTNODE *)malloc(sizeof(BTNODE));
    if (PNodeA == NULL || PNodeB == NULL || PNodeC == NULL || PNodeD == NULL || PNodeE == NULL) {
        printf("分配空间失败\n");
        exit(-1);
    }
    
    PNodeA->data = 'A';
    PNodeB->data = 'B';
    PNodeC->data = 'C';
    PNodeD->data = 'D';
    PNodeE->data = 'E';
    
    PNodeA->pLeftChild = PNodeB;
    PNodeA->pRightChild = PNodeC;
    PNodeB->pLeftChild = NULL;
    PNodeB->pRightChild = NULL;
    PNodeC->pLeftChild = PNodeD;
    PNodeC->pRightChild = NULL;
    PNodeD->pLeftChild = NULL;
    PNodeD->pRightChild = PNodeE;
    PNodeE->pLeftChild = NULL;
    PNodeE->pRightChild = NULL;
    
    return PNodeA;
}

C语言二叉树链式创建时,为什么传入的是指针的指针?

在学习数据结构中,有关于二叉树的建立与遍历中,有如此程序:

#include <stdio.h>
#include <mm_malloc.h>

typedef struct Node
{
    char data;
    struct Node * lChild;
    struct Node * rChild;
}BTREE, *PBTREE;//建立全部大写

void preTraverseBTree(PBTREE pTree);

void createBTree(PBTREE * qTree)
{
    //qTree是struct Node **类型
    //*qTree是struct Node *类型
    char data;
    scanf("%c", &data);
    if (' ' == data) {
        *qTree = NULL;//*qTree 等价于struct Node *类型
    }else
    {
        *qTree = (PBTREE)malloc(sizeof(BTREE));
        (*qTree)->data = data;
        createBTree(&((*qTree)->lChild));
        createBTree(&((*qTree)->rChild));
    }
    return;
}

int main(void)
{
    PBTREE pTree = NULL;
    createBTree(&pTree);//这个地方传入的是指针的指针,才能修改指针T的值
    //createBTree(pTree);//如果是这样,传入的是指针,只能改变*pTree即struct Node的值,并不能够改变pTree(struct Node *)的值
    preTraverseBTree(pTree);
    return 0;
}

void preTraverseBTree(PBTREE pTree)
{
    if (pTree != NULL)
    {
        printf("%c ", pTree->data);
        preTraverseBTree(pTree->lChild);
        preTraverseBTree(pTree->rChild);
    }
    return;
}

其中,在创建二叉树的时候,传入的形参是PBTREE *类型的,一开始以为应该把*号去掉,直接传指针PBTREE(struct Node *)就可以了,但是,这样的话,函数createBTree只能够修改struct Node的值,而并不能够修改PBTREE(struct Node *)本身的值,因此,需要传入指针的指针,才可以在createBTree函数内部修改PBTREE(struct Node *)的值。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值