创建如图所示的二叉树。
先序遍历为: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;
}

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐