二叉树的遍历、深度、叶子节点个数( C++ )

二叉树的遍历、深度、叶子节点个数( C++ )

用递归的方法实现以下二叉树算法:

(1) 以二叉链表表示二叉树,建立一棵二叉树(先序);
(2) 输出二叉树的中序遍历结果;
(3) 输出二叉树的前序遍历结果;
(4) 输出二叉树的后序遍历结果;
(5) 计算二叉树的深度;
(6) 统计二叉树的叶子结点个数;:

1.源代码

#include <stdio.h>
#include <malloc.h>
#include <iostream>
#define Max_size 100


typedef char ElemType;
typedef struct node
{
    ElemType data;
    struct node *lchild;
    struct node *rchild;
}BTNode;

void CreateBTree(BTNode *&b, char *str)
{
    BTNode *St[Max_size], *p;
    int top = -1,k,j = 0;
    char ch;
    b = NULL;
    ch = str[j];
    while (ch != '\0')
    {
        switch (ch) {
            case '(':top++;St[top] = p;k = 1;break;
            case ')':top--;break;
            case ',':k = 2;break;
            default:p = (BTNode *)malloc(sizeof(BTNode));
            p->data = ch;p->lchild = p->rchild = NULL;
            if (b == NULL)
                b = p;
            else
            {
                switch (k) {
                    case 1:St[top] -> lchild = p;break;
                    case 2:St[top] -> rchild = p;break;
                }
            }

        }
        j++;
        ch = str[j];
    }
}

void Destory(BTNode *&b)
{
    if(b != NULL)
    {
        Destory(b ->lchild);
        Destory(b ->rchild);
        free(b);
    }
}

BTNode *Find(BTNode *b, ElemType x)
{
    BTNode *p;
    if (b == NULL)
        return NULL;
    else if (b->data == x)
        return b;
    else
    {
        p = Find(b->lchild,x);
        if (p != NULL)
            return p;
        else
            return Find(b->rchild,x);
    }
}

BTNode * LchildNode(BTNode *p)
{
    return p->lchild;
}

BTNode * RchildNode(BTNode *p)
{
    return p->rchild;
}

int Height(BTNode *b)
{
    int lchildh,rchildh;
    if(b == NULL)
        return 0;
    else
    {
        lchildh = Height(b ->lchild);
        rchildh = Height(b ->rchild);
        return (lchildh > rchildh)?(lchildh + 1):(rchildh + 1);
    }
}

void Display(BTNode *b)
{
    if (b != NULL)
    {
        printf("%c", b->data);
        if (b ->lchild != NULL || b ->rchild != NULL)
        {
            printf("(");
            Display(b->lchild);
            if (b ->rchild != NULL)
                printf(",");
            Display(b ->rchild);
            printf(")");
        }
    }
}

void PreOrder(BTNode *b)
{
    if (b != NULL)
    {
        printf("%c", b ->data);
        PreOrder(b ->lchild);
        PreOrder(b ->rchild);
    }
}

void InOrder(BTNode *b)
{
    if (b != NULL)
    {
        InOrder(b ->lchild);
        printf("%c", b ->data);
        InOrder(b->rchild);

    }
}

void PostOrder(BTNode *b)
{
    if (b != NULL)
    {
        PostOrder(b -> lchild);
        PostOrder(b -> rchild);
        printf("%c", b->data);
    }
}

int LeafNode(BTNode *b)
{
    int num1, num2;
    if(b == NULL)
        return 0 ;
    else if (b ->lchild == NULL && b -> rchild == NULL)
        return 1;
    else
    {
        num1 = LeafNode(b -> lchild);
        num2 = LeafNode(b -> rchild);
        return (num1 +num2);
    }
}
int main()
{
    char TREE;
    BTNode *b;
    printf("请输入以括号形式定义的二叉树:\n");
    scanf("%s", &TREE);
    CreateBTree(b,  &TREE);
    printf("二叉树:");
    Display(b);
    printf("\n");
    printf("先序遍历:\n");
    PreOrder(b);printf("\n");
    printf("中序遍历:\n");
    InOrder(b);printf("\n");
    printf("后续遍历:\n");
    PostOrder(b);printf("\n");
    printf("二叉树的深度为%d\n", Height(b));
    printf("二叉树的叶子结点的个数为%d\n", LeafNode(b));
    return 1;
}


2.结果展示

如下图:
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值