24.P196课后习题7-20:编写求二叉树中叶结点个数的函数(提示:这是一个遍历问题)。

24.P196课后习题7-20:编写求二叉树中叶结点个数的函数(提示:这是一个遍历问题)。

头文件1:BiTree.h

#include<stdio.h>
#include<stdlib.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;
}

BiTreeNode* InsertLeftNode(BiTreeNode* curr, DataType x)
{
    BiTreeNode* s, * t;
    if (curr == NULL)
        return NULL;
    t = curr->leftChild;
    s = (BiTreeNode*)malloc(sizeof(BiTreeNode));
    s->data = x;
    s->leftChild = t;
    s->rightChild = NULL;
    curr->leftChild = s;
    return curr->leftChild;
}

BiTreeNode* InsertRightNode(BiTreeNode* curr, DataType x)
{
    BiTreeNode* s, * t;
    if (curr == NULL)
        return NULL;
    t = curr->rightChild;
    s = (BiTreeNode*)malloc(sizeof(BiTreeNode));
    s->data = x;
    s->rightChild = t;
    s->leftChild = NULL;
    curr->rightChild = s;
    return curr->rightChild;
}

void Destroy(BiTreeNode** root)
{
    if ((*root) != NULL && (*root)->leftChild != NULL)
        Destroy(&(*root)->leftChild);
    if ((*root) != NULL && (*root)->rightChild != NULL)
        Destroy(&(*root)->rightChild);
    free(*root);
}

头文件2:BiTreeTraverse.h

#include"BiTree.h"

void Visit(DataType item)
{
    printf("%c ", item);
}

void PrintBiTree(BiTreeNode* root, int n)
{
    int i;
    if (root == NULL)
        return;
    PrintBiTree(root->rightChild, n + 1);
    for (i = 0; i < n - 1; i++)
        printf("   ");
    if (n > 0)
    {
        printf("---");
        printf("%c\n", root->data);
    }
    PrintBiTree(root->leftChild, n + 1);
}

BiTreeNode* Search(BiTreeNode* root, DataType 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 PreOrder(BiTreeNode* t, void Visit(DataType item))
{
    if (t != NULL)
    {
        Visit(t->data);
        PreOrder(t->leftChild, Visit);
        PreOrder(t->rightChild, Visit);
    }
}

void InOrder(BiTreeNode* t, void Visit(DataType item))
{
    if (t != NULL)
    {
        InOrder(t->leftChild, Visit);
        Visit(t->data);
        InOrder(t->rightChild, Visit);
    }
}

void PostOrder(BiTreeNode* t, void Visit(DataType item))
{
    if (t != NULL)
    {
        PostOrder(t->leftChild, Visit);
        PostOrder(t->rightChild, Visit);
        Visit(t->data);
    }
}

//求叶子结点个数 (法一) 
int BiTreeLeaves(BiTreeNode* bt)
{
    if (bt == NULL)
    {
        return 0;
    }
    if (bt->leftChild == NULL && bt->rightChild == NULL)
    {
        return 1;
    }
    return(BiTreeLeaves(bt->leftChild) + BiTreeLeaves(bt->rightChild));
}

//求叶子结点个数 (法二) 
int TreeLeaves(BiTreeNode* bt)
{
    static int count = 0;
    if (bt == NULL)
    {
        return 0;
    }
    if (bt->leftChild == NULL && bt->rightChild == NULL)
    {
        count++;
    }
    TreeLeaves(bt->leftChild);
    TreeLeaves(bt->rightChild);
    return count;
}

//求树的深度 
int Depth(BiTreeNode* bt)
{
    int leftDepth = 0;
    int rightDepth = 0;
    if (bt == NULL)
    {
        return -1;
    }
    if (bt->leftChild != NULL)
    {
        leftDepth = Depth(bt->leftChild);
    }
    else
    {
        leftDepth = -1;
    }
    if (bt->rightChild != NULL)
    {
        rightDepth = Depth(bt->rightChild);
    }
    else
    {
        rightDepth = -1;
    }
    return(rightDepth > leftDepth) ? rightDepth + 1 : leftDepth + 1;
}

源文件:main.c

#include "BiTreeTraverse.h" 

int main()
{
    BiTreeNode* root, * p;
    Initiate(&root);
    p = InsertLeftNode(root, 'A');
    p = InsertLeftNode(p, 'B');
    p = InsertLeftNode(p, 'D');
    p = InsertRightNode(p, 'G');
    p = InsertRightNode(root->leftChild, 'C');
    InsertLeftNode(p, 'E');
    InsertRightNode(p, 'F');
    PrintBiTree(root, 0);
    printf("该二叉树的叶节结点个数为%d", BiTreeLeaves(root));
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值