数据结构入门6

这两天看完了树, 可惜没讲图. 接下来还找了一堆课和教材. 也不知道那个好一些.

写了一个静态的树, 讲了先序中序和后序.

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

struct BTNode
{
    char data;
    struct BTNode* pLchild; // 左孩子
    struct BTNode* pRchild; // 右孩子
};

struct BTNode* CreateBinTree(void);
void PreOrderBTree(struct BTNode* pRoot);

int main(void)
{
    // 使用根结点的地址可以定位一个二叉树
    struct BTNode* pTree = CreateBinTree();

    //PreOrderBTree(pTree);
    //InOrderBTree(pTree);
    //PostOrderBTree(pTree);


    return 0;
}

struct BTNode* CreateBinTree(void)
{
    struct BTNode* pA = (struct BTNode* )malloc(sizeof(struct BTNode));
    struct BTNode* pB = (struct BTNode* )malloc(sizeof(struct BTNode));
    struct BTNode* pC = (struct BTNode* )malloc(sizeof(struct BTNode));
    struct BTNode* pD = (struct BTNode* )malloc(sizeof(struct BTNode));
    struct BTNode* pE = (struct BTNode* )malloc(sizeof(struct BTNode));

    pA->data = 'A';
    pB->data = 'B';
    pC->data = 'C';
    pD->data = 'D';
    pE->data = 'E';

    pA->pLchild = pB;
    pA->pRchild = pC;
    pB->pLchild = NULL;
    pB->pRchild = NULL;
    pC->pLchild = pD;
    pC->pRchild = NULL;
    pD->pLchild = NULL;
    pD->pRchild = pE;
    pE->pLchild = NULL;
    pE->pRchild = NULL;

    return pA;
};


// 先序访问:
// 1. 根节点
// 2. 先序左子树
// 3. 先序右子树
void PreOrderBTree(struct BTNode* pRoot)
{
    // 递归终止条件, 防止无限递归
    if(pRoot != NULL)
    {
        printf("%c\n", pRoot->data);  // 先打印根节点

        // 使用if判断省去子节点为空的情况
        if (pRoot->pLchild != NULL)
        {
            PreOrderBTree(pRoot -> pLchild); // 递归处理左子树
        }

        if (pRoot->pRchild != NULL)
        {
            PreOrderBTree(pRoot->pRchild); // 递归处理右子树
        }
    }
}

void InOrderBTree(struct BTNode* pRoot)
{
    // 递归终止条件, 防止无限递归
    if(pRoot != NULL)
    {
        // 使用if判断省去子节点为空的情况
        if (pRoot->pLchild != NULL)
        {
            InOrderBTree(pRoot -> pLchild); // 递归处理左子树
        }

        printf("%c\n", pRoot->data);  // 先打印根节点

        if (pRoot->pRchild != NULL)
        {
            InOrderBTree(pRoot->pRchild); // 递归处理右子树
        }
    }
}

void PostOrderBTree(struct BTNode* pRoot)
{
    // 递归终止条件, 防止无限递归
    if(pRoot != NULL)
    {
        // 使用if判断省去子节点为空的情况
        if (pRoot->pLchild != NULL)
        {
            PostOrderBTree(pRoot -> pLchild); // 递归处理左子树
        }

        if (pRoot->pRchild != NULL)
        {
            PostOrderBTree(pRoot->pRchild); // 递归处理右子树
        }

        printf("%c\n", pRoot->data);  // 先打印根节点
    }
}

/*
    先序PreOrder
    打印根节点
    递归处理左子树
    递归处理右子树

    中序InOrder
    递归处理左子树
    打印根节点
    递归处理右子树

    后序PostOrder
    递归处理左子树
    递归处理右子树
    打印根节点
*/


posted @ 2025-06-14 00:25  鲲特牌  阅读(6)  评论(0)    收藏  举报