根据遍历序列构建二叉树

任务要求:

根据遍历序列构建二叉树,分别实现根据前序和中序序列,中序和后序序列构建二叉树。

相关知识:

掌握三点

①构造二叉树;
②算法思想1;
③算法思想2。

构造二叉树
给定一棵二叉树的前序遍历序列和中序遍历序列可以构造出这棵二叉树。例如前序序列是ABDECFG,中序序列是 DBEAFCG,那么这棵二叉树的结构如图 1所示。

算法思想1
给定一棵二叉树的前序遍历序列和中序遍历序列可以构造出这棵二叉树。算法过程如下:
1)根据先序遍历的性质,先序序列中的第一个元素就是根节点root。确定该点在中序序列中的位置k。
2)中序序列中:该位置k的左边都是左子树,右边都是是右子树。
3)左子树的根节点就是根节点root的左孩子,右子树的根节点就是根节点root的右孩子。
 3.1)递归构造左子树
 3.2)递归构造右子树。

算法思想2
给定一棵二叉树的后序遍历序列和中序遍历序列可以构造出这棵二叉树。算法过程如下:
1)根据后序遍历的性质,后序序列中的最后一个元素就是根节点root。确定该点在中序序列中的位置k。
2)中序序列中:该位置k的左边都是左子树,右边都是是右子树。
3)左子树的根节点就是根节点root的左孩子,右子树的根节点就是根节点root的右孩子。
 3.1)递归构造左子树。
 3.2)递归构造右子树。

#include <iostream>
using namespace std;

typedef struct node {
    char data;
    struct node *lchild, *rchild;
} binnode, *bintree;

void CreateBinTreebyPreIn(char *pre, char *in, int n, bintree &T);
void CreateBinTreebyPostIn(char *in, char *post, int n, bintree &T);
void DispBinTree(bintree T);

// 辅助函数,用于通过前序和中序序列查找根节点在中序序列中的位置
int FindRootInInorder(char *in, int inStart, int inEnd, char rootData) {
    for (int i = inStart; i <= inEnd; i++) {
        if (in[i] == rootData) {
            return i;
        }
    }
    return -1; // 不应该发生
}

// 辅助函数,用于通过中序和后序序列查找根节点在中序序列中的位置
int FindRootInPostorder(char *in, int inStart, int inEnd, char rootData) {
    for (int i = inStart; i <= inEnd; i++) {
        if (in[i] == rootData) {
            return i;
        }
    }
    return -1; // 不应该发生
}

void CreateBinTreebyPreIn(char *pre, char *in, int n, bintree &T) {
    if (n <= 0) {
        T = NULL;
        return;
    }
    
    // 创建根节点
    T = new binnode;
    T->data = *pre;
    T->lchild = T->rchild = NULL;
    
    // 在中序序列中找到根节点的位置
    int rootIndex = FindRootInInorder(in, 0, n - 1, *pre);
    
    // 递归构造左子树和右子树
    CreateBinTreebyPreIn(pre + 1, in, rootIndex, T->lchild);
    CreateBinTreebyPreIn(pre + rootIndex + 1, in + rootIndex + 1, n - rootIndex - 1, T->rchild);
}

void CreateBinTreebyPostIn(char *in, char *post, int n, bintree &T) {
    if (n <= 0) {
        T = NULL;
        return;
    }
    
    // 创建根节点
    T = new binnode;
    T->data = post[n - 1];
    T->lchild = T->rchild = NULL;
    
    // 在中序序列中找到根节点的位置
    int rootIndex = FindRootInPostorder(in, 0, n - 1, post[n - 1]);
    
    // 递归构造左子树和右子树
    CreateBinTreebyPostIn(in, post, rootIndex, T->lchild);
    CreateBinTreebyPostIn(in + rootIndex + 1, post + rootIndex, n - rootIndex - 1, T->rchild);
}




int main()
{
    bintree T;
    char *pre,*in,*post;
    int n;
    cin>>n;
    pre=new char[n];
    in=new char[n];
    post=new char[n];
    cin>>pre;
    cin>>in;
    cin>>post;
    CreateBinTreebyPreIn(pre,in,n,T);
    cout<<"\nthe result is:";
    if (T==NULL)
        cout<<"\nnull";
    else
        DispBinTree(T);
    CreateBinTreebyPostIn(in,post,n,T);
    cout<<"\nthe result is:";
    if (T==NULL)
        cout<<"\nnull";
    else
        DispBinTree(T);
    return 0;
}
void DispBinTree(bintree T)
{
    if (T==NULL) return ;
    cout<<T->data;
    if (T->lchild || T->rchild)
    {
        cout<<"(";
        DispBinTree(T->lchild);
        if (T->rchild) cout<<",";
        DispBinTree(T->rchild);
        cout<<")";
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小狗碎碎念

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值