数据结构--二叉树--小小例题(完整注释)

本文介绍二叉树的链式存储结构及前序、中序、后序遍历算法,演示如何在二叉树中插入新节点并查询特定元素的存在。通过实例展示二叉树的基本操作,包括节点的插入、遍历和查询。

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

  • 题目:二叉树的链式存储结构的建立、前序、中序、后序遍历的算法,查询“E”是否在二叉树。
    #include <stdlib.h>
    #include <stdio.h>
    typedef char DataType;
    typedef struct Node
    {
        DataType data;/*数据域*/
        struct Node *leftChild;/*左子树指针*/
        struct Node *rightChild;/*右子树指针*/
    }BiTreeNode;/*结点的结构体定义*/
    void Initiate(BiTreeNode **root)                             /*初始化创建二叉树的头结点*/
    {
        *root = (BiTreeNode *)malloc(sizeof(BiTreeNode));
        (*root)->leftChild = NULL;
        (*root)->rightChild = NULL;
    }
    void Destroy(BiTreeNode **root)
    {
        if((*root) != NULL && (*root)->leftChild != NULL)
            Destroy(&(*root)->leftChild);
    
        if((*root) != NULL && (*root)->rightChild != NULL)
            Destroy(&(*root)->rightChild);
        free(*root);
    }
    /*若当前结点curr非空,在curr的左子树插入元素值为x的新结点*/
    /*原curr所指结点的左子树成为新插入结点的左子树*/
    /*若插入成功返回新插入结点的指针,否则返回空指针*/
    BiTreeNode *InsertLeftNode(BiTreeNode *curr, DataType x)
    {
        BiTreeNode *s, *t;
        if(curr == NULL) return NULL;
        t = curr->leftChild;/*保存原curr所指结点的左子树指针*/
        s = (BiTreeNode *)malloc(sizeof(BiTreeNode));
        s->data = x;
        s->leftChild = t;/*新插入结点的左子树为原curr的左子树*/
        s->rightChild = NULL;
        curr->leftChild = s;/*新结点成为curr的左子树*/
        return curr->leftChild;/*返回新插入结点的指针*/
    }
    /*若当前结点curr非空,在curr的右子树插入元素值为x的新结点*/
    /*原curr所指结点的右子树成为新插入结点的右子树*/
    /*若插入成功返回新插入结点的指针,否则返回空指针*/
    BiTreeNode *InsertRightNode(BiTreeNode *curr, DataType x)
    {
        BiTreeNode *s, *t;
        if(curr == NULL) return NULL;
        t = curr->rightChild;/*保存原curr所指结点的右子树指针*/
        s = (BiTreeNode *)malloc(sizeof(BiTreeNode));
        s->data = x;
        s->rightChild = t;/*新插入结点的右子树为原curr的右子树*/
        s->leftChild = NULL;
        curr->rightChild = s;/*新结点成为curr的右子树*/
        return curr->rightChild;/*返回新插入结点的指针*/
    }
    void PreOrder(BiTreeNode *t, void visit(DataType item))
    //使用visit(item)函数前序遍历二叉树t
    {
        if(t != NULL)
    {
        visit(t->data);
            PreOrder(t-> leftChild, visit);
            PreOrder(t-> rightChild, visit);
        }
    }
    void InOrder(BiTreeNode *t, void visit(DataType item))
    //使用visit(item)函数中序遍历二叉树t
    {
        if(t != NULL)
        {
            InOrder(t->leftChild, visit);
            visit(t->data);
            InOrder(t->rightChild, visit);
        }
    }
    void PostOrder(BiTreeNode *t, void visit(DataType item))
    //使用visit(item)函数后序遍历二叉树t
    {
        if(t != NULL)
        {
            PostOrder(t->leftChild, visit);
            PostOrder(t->rightChild, visit);
            visit(t->data);
        }
    }
    void Visit(DataType item)
    {
        printf("%c ", item);
    }
    BiTreeNode *Search(BiTreeNode *root, DataType x)//需找元素x是否在二叉树中
    {
        BiTreeNode *find=NULL;
        if(root!=NULL)
        {
             if(root->data==x)
                find=root;
             else
            {
                find=Search(root->leftChild,x);
                if(find==NULL)
                      find=Search(root->rightChild,x);
            }
        }
        return find;
    }
    void main(void)
    {
        BiTreeNode *root, *p, *pp,*find;
        char x='E';
        Initiate(&root);
        p = InsertLeftNode(root, 'A');
        p = InsertLeftNode(p, 'B');
        p = InsertLeftNode(p, 'D');
        p = InsertRightNode(p, 'G');
        p = InsertRightNode(root->leftChild, 'C');
        pp = p;
        InsertLeftNode(p, 'E');
        InsertRightNode(pp, 'F');
        printf("前序遍历:");
        PreOrder(root->leftChild, Visit);
        printf("\n中序遍历:");
        InOrder(root->leftChild, Visit);
        printf("\n后序遍历:");
        PostOrder(root->leftChild, Visit);
        find=Search(root,x);
        if(find!=NULL)
             printf("\n数据元素%c在二叉树中 \n",x);
        else
             printf("\n数据元素%c不在二叉树中 \n",x);
        Destroy(&root);
    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值