已知前序中序->构建二叉树

二叉树前序:  根  - > 左  - >  右    前序给出的第一个节点为根节点

二叉树中序:  左  - > 根  - >  右     中序可以在前序的基础上将树的左孩子,右孩子,完全确定。 下面就是一个递归的过程

每次递归过程中 拿当前传入的前序遍历的首节点 找到中序遍历的该首节点的位置。并将其划分为左右两个子树。并链接在结构体指针上

#include <iostream>

#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define Maxn 50
typedef struct Treenode* BinTree;//重新命名,typedef 即便之前未声明 Treenode 结构体,编译器不会检查语法问题。
struct Treenode
{
    char Data;
    BinTree Left; //指向左孩子的结构体指针
    BinTree Right; //指向右孩子的结构体指针
};


BinTree CreateBinTree (char *Pre,char *In,int len)
{
    BinTree T;
    int i;
    if(!len)
    {
        return NULL;
    }
    T=(BinTree)malloc(sizeof(struct Treenode));
    T->Data=Pre[0];
    for(i=0;i<len;i++) //从中序遍历中,找到当前传入的前序遍历的头节点(递归后仍然相同)。
    {
        if(Pre[0]==In[i])
            break;
    }
    T->Left=CreateBinTree(Pre+1,In,i); // 递归: 完全建立根节点的左子树
    T->Right=CreateBinTree(Pre+i+1,In+i+1,len-i-1); // 递归: 完全建立根节点的右子树
    return T;
}
int Height(BinTree T)
{
    int Theigth,Lheight,Rheight;
    if(!T)
    Theigth =0;
    else
    {

        Lheight=Height(T->Left); //求出根节点左子树的最大高度

        Rheight=Height(T->Right); // 求出根节点右子树的最大高度
        Theigth=(Lheight>Rheight)?Lheight:Rheight;
        Theigth++;
    }
        return Theigth;
}
int main()
{
    int N;
    char Pre[Maxn+1],In[Maxn+1];
    BinTree T=NULL;
    scanf("%d",&N);
    scanf("%s\n%s",Pre,In);   // 给出前中序
    T=CreateBinTree(Pre,In,N); //构建二叉树,用结构体指针T来接收。
    cout<<Height(T);                  // 检测树高,确定二叉树正确建立(层序也可);
    return 0;
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值