孩子兄弟链存储实现

#include <stdio.h>
#include <malloc.h>
#include <iostream>
using namespace std;
#define MaxSize 100
typedef struct tnode
{
    char data; //节点的值
    struct tnode *hp; //指向兄弟
    struct tnode *vp; //指向孩子节点
} TSBNode; //孩子兄弟链存储结构类型
TSBNode *CreateTree(char *str) //由str建立孩子兄弟链存储结构
{
    struct
    {
        TSBNode *nodep; //节点指针
        int num; //孩子个数
    } St[MaxSize]; //顺序栈
    int top = -1; //栈顶指针
    int i = 0, j;
    char ch = str[i];
    TSBNode *t = NULL, *p, *q;
    while (ch != '\0')
    {
        switch (ch)
        {
        case '(':
            top++;
            St[top].nodep = p;
            St[top].num = 0; //当前节点p进栈
            break;
        case ')':
            top--;
            break; //退栈
        case ',':
            St[top].num++;
            break; //栈顶节点增加一个孩子
        default:
            p = (TSBNode *)malloc(sizeof(TSBNode));
            p->data = ch; //建立一个节点p存放ch
            p->hp = p->vp = NULL;
            if (t == NULL) //原为空树
                t = p; //将其作为栈顶节点的一个孩子
            else
            {
                if (St[top].num == 0) //第一个孩子用vp指向它
                    St[top].nodep->vp = p;
                else //其他孩子用栈顶节点的孩子节点的hp指向它
                {
                    q = St[top].nodep->vp;
                    for (j = 1; j < St[top].num; j++)
                        q = q->hp;
                    q->hp = p;
                }
            }
            break;
        }
        i++;
        ch = str[i];
    }
    return t;
}
void DispTree(TSBNode *t) //输出孩子兄弟链存储结构
{
    TSBNode *p;
    if (t != NULL)
    {
        printf("%c", t->data);
        if (t->vp != NULL) //有孩子时输出一个'('
        {
            printf("(");
            p = t->vp; //p指向节点t的第一个孩子
            while (p != NULL)
            {
                DispTree(p);
                p = p->hp;
                if (p != NULL)
                    printf(",");
            }
            printf(")"); //输出一个')'
        }
    }
}
void DestroryTree(TSBNode *&t) //销毁树t
{
    if (t != NULL)
    {
        DestroryTree(t->vp);
        DestroryTree(t->hp);
        free(t); //释放根节点
    }
}
//写出这个函数的递归调用顺序
int TreeHeight2(TSBNode *t)
{
    TSBNode *p;
    int h, maxh = 0;
    if (t == NULL)
    {
        return 0; //空树返回0
    }
    else
    {
        cout << "t = " << t->data << endl;
        p = t->vp; //指向第1个孩子节点
        while (p != NULL) //扫描t的所有子树
        {
            h = TreeHeight2(p); //求出p子树的高度
            cout << "h = " << h << endl;
            if (maxh < h)
                maxh = h; //求所有子树的最大高度
            p = p->hp; //继续处理t的其他子树
        }
        return (maxh + 1); //返回maxh+1
    }
}
int main()
{
    TSBNode *t;
    t = CreateTree("A(B,C(E,F,G),D)");
    //printf("t:");
    //DispTree(t);
    printf("\n树t的高度:%d\n", TreeHeight2(t));
    DestroryTree(t);
    return 1;
}

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值