【数据结构】先序遍历+中序遍历创建二叉树(C++实现)

本文介绍如何利用先序遍历和中序遍历构建二叉树,并实现先序和中序遍历算法。通过具体示例展示了二叉树的创建过程及遍历输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建如图所示的二叉树。
先序遍历为:ABDGECF
中序遍历为:DGBEAFC

创建结构体

定义二叉树中每个结点的数据,以及左右孩子。

typedef struct BiNode {
    char data;                      //结点数据
    struct BiNode *lchild, *rchild; //左右子树指针
} BiNode, *BiTree;

先序遍历

按照根->左->右的顺序递归遍历二叉树,并打印输出。

//先序遍历
void PreOrder(BiTree T) {
    if (T != NULL) {
        cout << T->data << '\t'; //首先访问根结点
        PreOrder(T->lchild);     //再访问左子树
        PreOrder(T->rchild);     //再访问右子树
    }
}

中序遍历

按照左->根->右的顺序递归遍历二叉树,并打印输出。

//中序遍历  左   根   右
void InOrder(BiTree T) {
    if (T != NULL) {
        InOrder(T->lchild);      //先访问左子树
        cout << T->data << '\t'; //再访问根结点
        InOrder(T->rchild);      //再访问右子树
    }
}

先序遍历+中序遍历创建二叉树

传入参数:

  • 当前结点的引用(表示需要将对指针修改带回)
  • 先序遍历的数组
  • 中序遍历的数组
  • 数组长度
void BuildTree(BiTree &T, char *pre, char *in, int n) {
    // T:二叉树的指针 pre:先序遍历 in:中序遍历 n:二叉树的结点个数
    if (n == 0) {
        return;
    }
    //根结点
    char root = pre[0];
    //创建结点,让当前指针指向该结点
    T = new BiNode();
    T->data = root;
    //左子树个数
    int left = 0;
    for (int i = 0; i < n; i++) {
        if (in[i] != root) {
            left++;
        } else {
            break;
        }
    }
    //右子树个数
    int right = n - left - 1;
    //递归创建左子树
    BuildTree(T->lchild, pre + 1, in, left);
    //递归创建右子树
    BuildTree(T->rchild, pre + left + 1, in + left + 1, right);
}

结果预览:

完整代码

#include <iostream>
using namespace std;

//定义树的结构
typedef struct BiNode {
    char data;                      //结点数据
    struct BiNode *lchild, *rchild; //左右子树指针
} BiNode, *BiTree;

//先序遍历  根  左  右
void PreOrder(BiTree T) {
    if (T != NULL) {
        cout << T->data << '\t'; //首先访问根结点
        PreOrder(T->lchild);     //再访问左子树
        PreOrder(T->rchild);     //再访问右子树
    }
}

//中序遍历  左   根   右
void InOrder(BiTree T) {
    if (T != NULL) {
        InOrder(T->lchild);      //先访问左子树
        cout << T->data << '\t'; //再访问根结点
        InOrder(T->rchild);      //再访问右子树
    }
}

//先序遍历+中序遍历创建二叉树
void BuildTree(BiTree &T, char *pre, char *in, int n) {
    // T:二叉树的指针 pre:先序遍历 in:中序遍历 n:二叉树的结点个数
    if (n == 0) {
        return;
    }
    //根结点
    char root = pre[0];
    //创建结点,让当前指针指向该结点
    T = new BiNode();
    T->data = root;
    //左子树个数
    int left = 0;
    for (int i = 0; i < n; i++) {
        if (in[i] != root) {
            left++;
        } else {
            break;
        }
    }
    //右子树个数
    int right = n - left - 1;
    //递归创建左子树
    BuildTree(T->lchild, pre + 1, in, left);
    //递归创建右子树
    BuildTree(T->rchild, pre + left + 1, in + left + 1, right);
}

//由前序遍历和中序遍历创建二叉树
int main(int argc, char const *argv[]) {
    BiTree T;
    char pre[] = {'A', 'B', 'D', 'E', 'C', 'F'};
    char in[] = {'D', 'B', 'E', 'A', 'C', 'F'};
    BuildTree(T, pre, in, 6);
    cout << "先序遍历:" << endl;
    PreOrder(T);
    cout << endl;
    cout << "中序遍历:" << endl;
    InOrder(T);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

每天进步一点丶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值