先中序建二叉树

先中序or中后序建立二叉树

二叉树的顺序

  • 二叉树的顺序(先左后右的顺序,相反顺序相反)
    • 先(根)序遍历
    • 中(根)序遍历
    • 后(根)序遍历

可以根据中序和先序/后序建立二叉树,但是必须要有中序,因为只有这样可以划分左右子树,递归的完成序列的访问。

先序和中序建立二叉树

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef char ElemType;
typedef struct node
{
    ElemType data;
    struct node *lchild;
    struct node *rchild;
}*BiTree, *BiNode;
int n;
char str1[256];
char str2[256];
BiTree CreatTree(int s1, int t1, int s2, int t2)
{
    int i;
    for(i=s2; i<=t2; i++)
    {
        if(str1[s1]==str2[i])
            break;
    }
    if(i<=t2)
    {
        BiTree root=(BiTree)malloc(sizeof(BiNode));
        root->data=str2[i];
        root->lchild=CreatTree(s1+1, s1+i-s2, s2, i-1);
        root->rchild=CreatTree(s1+i+1-s2, t1, i+1, t2);
        return root;
    }
    else
    {
        return NULL;
    }
    return 0;
}
int Depth(BiTree root)
{
    int depth=1;
    int depthleft=0;
    int depthright=0;
    if(!root)
    {
        return 0;
    }
    else
    {
        depthleft=Depth(root->lchild);
        depthright=Depth(root->rchild);
        depth+=(depthleft>depthright ? depthleft:depthright);
    }
    return depth;
}

int main()
{
    int n;
    while(scanf("%d", &n)!=EOF)
    {
        scanf(" %s", str1);
        scanf(" %s", str2);
        BiTree root;
        int num=0;
        root=CreatTree(0, n-1, 0, n-1);
        num=Depth(root);
        printf("%d\n", num);
    }
    return 0;
}

中序和后序建立二叉树

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef char ElemType;
typedef struct node
{
    ElemType data;
    struct node *rchild;
    struct node *lchild;
}*BiTree, BiNode;
char str1[345];
char str2[345];
BiTree CreatTree(int s1, int t1, int s2, int t2)
{
    int i;
    for(i=s1; i<=t1; i++)
    {
        if(str1[i]==str2[t2])
            break;
    }
    if(i<=t1)
    {
        BiTree root=(BiTree)malloc(sizeof(BiNode));
        root->data=str1[i];
        root->lchild=CreatTree(s1,i-1, s2, s2+i-s1-1 );
        root->rchild=CreatTree(i+1,t1, s2+i-s1, t2-1);
        return root;
    }
    else
    {
        return NULL;
    }
    return 0;
}
int fow(BiTree root)
{
    if(root)
    {
        fow(root->lchild);
        printf("%c",root->data);
        fow(root->rchild);
    }
    return 0;
}

int Depth(BiTree root)
{
    int depth=1;
    int depthleft=0;
    int depthright=0;
    if(!root)
    {
        return 0;
    }
    else
    {
        depthleft=Depth(root->lchild);
        depthright=Depth(root->rchild);
        depth+=(depthleft>depthright ? depthleft:depthright);
    }
    return depth;
}
int main()
{
    int n;
    scanf("%d", &n);
    int i;
    int num=0;
    for(i=0; i<n; i++)
    {
        scanf(" %s", str1);
        scanf(" %s", str2);
        BiTree root;
        printf("%d %d\n", sizeof(str1), sizeof(str2));
        root=CreatTree(0, strlen(str1)-1, 0, strlen(str2)-1);
        //root=CreatTree(0, sizeof(str1)-1, 0, sizeof(str2)-1);
        //fow(root);
        num=Depth(root);
        printf("%d\n", num);
    }
    return 0;
}

补充一点:忘记了strlen()和sizeof()的作用,浪费了大量时间,在建立二叉树的过程中。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值