1:创建结点

#define MAXLEN 20
    typedef  char  DATA;
    typedef  struct  CBT
    {
        DATA data;
        struct CBT *left;
        struct CBT *right;
    }CBTType;

2:初始化树的根

CBTType *InitTree()//初始化树的根
    {
    CBTType *node;
    if(node=(CBTType*)malloc(sizeof(CBTType)))
//申请内存
        {
            printf("请先输入一个根节点数据:\n");
            scanf("%s",&node->data);
            node->left = NULL;
            node->right = NULL;
            if (node!=NULL)//二叉树根节点不为空
            {return node;}
            else
            {return NULL;}
        }
    }

3:显示节点数据

    void TreeNodeData(CBTType *p)
    {
        printf("%c",p->data);
    }

4:获取左子树

    CBTType*TreeLeftNode(CBTType*treeNode)
    {
        if (treeNode)
        {return treeNode->left;}
        else
        {return NULL;}
    }

5:获取右子树

    CBTType *TreeRightNode(CBTType *treeNode)
    {
        if (treeNode)
        {return treeNode->right;}
        else
        {return NULL;}
    }

6:判断是否为空树

    int TreeIsEmpty(CBTType *treeNode)
    {
        if (treeNode)
        {
            return 0;
        }
        else
        {
            return 1;
        }
    }

7:清空树

    void ClearTree(CBTType *treeNode)
    {
        if (treeNode)
        {
            ClearTree(treeNode->left);
            ClearTree(treeNode->right);         
            free(treeNode);                  
            treeNode = NULL;
        }
    }

8:先序遍历

    void DLR(CBTType *treeNode, void(*TreeNodeData)(CBTType *p))
    {
        if (treeNode)
        {
            TreeNodeData(treeNode);
            DLR(treeNode->left, TreeNodeData);
            DLR(treeNode->right, TreeNodeData);
        }
    }

9:中序遍历

    void LDR(CBTType *treeNode, void(*TreeNodeData)(CBTType *p))
    {
        if (treeNode)
        {
            LDR(treeNode->left, TreeNodeData);
            TreeNodeData(treeNode);     
            LDR(treeNode->right, TreeNodeData);
        }
    }

10:查找节点

    CBTType *TreeFindNode(CBTType *treeNode, DATA data)//查找节点
    {
        CBTType *ptr;
        if (treeNode==NULL)
        {return NULL;}
        else
        {
            if (treeNode->data==data)
            {return treeNode;}
            else
            {
                if(ptr== TreeFindNode(treeNode->left,data))//分别向左右子树递归查找
                {return ptr;}
                else if (ptr == TreeFindNode(treeNode->right, data))
                {return ptr;}
                else
                {return NULL;}
            }
        }
    }

11:计算二叉树深度

    int TreeDepth(CBTType *treeNode)
    {
        int depleft, depright;
        if (treeNode == NULL)
        {
            return 0;
        }
        else
        {
            depleft = TreeDepth(treeNode->left);
            depright = TreeDepth(treeNode->right);
            if (depleft>depright)
            {
                return depleft + 1;
            }
            else
            {
                return depright + 1;
            }
        }
    }

12:按层遍历

void LevelTree(CBTType *treeNode,void(*TreeNodeData)(CBTType *p))
    {
        CBTType *p;
        CBTType *q[MAXLEN];
//定义一个顺序栈
        int head = 0, tail = 0;
        if (treeNode)//如果队首指针不为空
        {
            tail = (tail+1) % MAXLEN; 
//计算循环队列的队尾
            q[tail]= treeNode;
        }
        while (head!= tail)
        {
            head = (head + 1) % MAXLEN;
            p = q[head];
            TreeNodeData(p);
            if (p->left!=NULL)
            {
                tail = (tail + 1) % MAXLEN;
                q[tail] = p->left;
            }
            if (p->right != NULL)/
/如果存在右子树
            {
                tail = (tail + 1) % MAXLEN;
                q[tail] = p->right;
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员的资料库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值